こんにちは。
キャスレーコンサルティングSI(システム・インテグレーション)部の西川です。
今回は、Java9の正式版が2017年9月にリリースされたということで、Java9の新機能であるJShellを使ってみました。
1 はじめに
今までは、Javaをいちから実行するためには、
ソースファイル作って~クラス宣言して~メイン文書いて~importして~
処理書いて~コンパイルして~実行して~といった手順を経る必要がありました。
しかし、JShellではプロンプトを表示して、いきなりJavaコードを実行することができます。
そして、Javaとは異なり、WindowsのDOSコマンドなどのように、1行ずつ実行していくことになります。
もちろんJavaらしく変数を使ったり、クラス宣言やメソッド宣言も行うことができ、以降の処理で使用することもできます。
(他のサイトで、たくさん解説されているため、詳細は省略させていただきます。)
2 JShellで出来ること
それでは、実際にJShellを起動して、出来ることを確認していきましょう。
1行実行
ありきたりですが、HelloWorldを表示してみます。
なお、あらかじめJShellの実行ファイルには、パスを通しています。
jshell
System.out.println("HelloWorld");
できましたね。
新しいプログラムを動かすときのド定番となる、プログラムですが、
Javaの場合、Eclipse無しで実行するのは、意外と面倒だとと思います。
それがJShellなら、たった2行打ち込むだけで実行できてしまうのは、素晴らしいと思います。
続いて、1+1
を打ち込んでみます。
$1 ==> 2 と表示されました。
JShellでは、このような左辺(代入先)を省略した式を実行すると、自動的に変数を作成してそこに代入してくれます。
変数なので、次のように以降の処理で、使用することもできます。
なお、当然ですが、$1(int)と$4(String)を計算することはできませんが、+演算子による文字列結合は可能です。
現在使用可能な変数を確認するには、/varコマンドを使用します。
コード補完
EclipseなどのIDEでは、お馴染みのコード補完もできます。
次は、f.li
まで入力して、Tabキーを押下した場合の動きです。
EclipseではCtrl+Spaceを打つところで、JShellはTabキーを押下すれば、候補が表示されます。
以降の文字の候補が、1つに絞られる場合は、自動的に入力されます。
クラス・メソッド定義
JShell上で、クラス宣言をして使用してみましょう。
名前が”test”で始まっている、ファイルを抽出するフィルターですが、きちんと動作していますね。
なお、ある程度補完できるとしても、クラス宣言をJShell上で打ち込むのは結構大変なので、
JShellの/Openコマンド(後述)を使用するのが、良いと思います。
import追加
さて、今までで実行した処理で、import宣言をまったくしていなかったのに、お気づきでしょうか。
JavaでFileクラスを使うには、java.io.Fileのimport宣言が必要ですが、
JShellでは標準で以下がimportされているので、
その中のクラスを使用するだけであれば、import宣言を行う必要はありません。
当然、上記以外のクラスを使う場合は、import宣言を行う必要があります。
試しに、Swingのクラスをimportして、ファイル選択ダイアログを表示してみましょう。
(javaFXじゃなくてごめんなさい)
表示されたダイアログがこちら
問題無く、ファイル選択ダイアログの内容を、取得できました。
2.2 実行したスクリプトの読込/保存
先ほどJShell上で宣言した、MyFilenameFilterですが、
クラス宣言や、メソッド宣言は最後の大括弧(”}”)を入力した時に、入力した内容の評価が行われるため、
途中で打ち間違えた場合に、最後まで気づくことができません。
そして、打ち間違いが無くなるまで、延々とトライ&エラーを、繰り返すことになります。
Javaの開発で、秀丸大先生がご活躍されていた時代を思い出して、思わず涙がでました。
これでは、せっかくのJShellも台無しなので、打ち間違いのリスクを極力減らしましょう。
(コーディングの間違いは、頑張りましょう)。
JShellには、テキストファイルを読み込んで、実行する機能(/Open)があります。
先ほど宣言した、MyFilenameFilterをテキストファイルに、記載します。
そして、このテキストファイルを、JShellから読み込みます。
先ほどのクラス宣言を、テキストファイルから、実施することができました。
3.スニペットのカンタン起動
JShellは、とてもカンタンにJavaのコードを勉強できるのが魅力ですが、
いざ実際に仕事で使うと、イマイチ活躍できる場面が想像できません…(私の想像力が無いだけかもしれませんが…)
やはり、コンパイルなしでJavaのコードを実行できる利点を生かして、
業務上よく使う処理を、スニペットとして保存しておき、すぐに実行できるようにすることで、
Java9の開発環境さえあれば、プラットフォームを選ばずにどこでも動く、
シェルスクリプトのようなものを、作れるのかと思いました。
そこで、少し本題からずれますが、Windows環境でエクスプローラーからダブルクリックで、
JShellを起動できるようにする設定を、してみたいと思います。
3.1 拡張子とデフォルトで開くアプリの設定
現状JShellの拡張子は、特に決まっていないようですので、こちらで決めてしまいましょう。
ここでは、「.jsh」としてみました。
拡張子「.jsh」のプロパティから開くアプリを、JShellの実行ファイルに設定します。
これで拡張子「.jsh」のファイルを、ダブルクリックすると、コマンドプロンプトとJShellが起動するはずが…
なぜか、実行したあとに、jshellのセッションが始まってしまいました…
DOSバッチなどで、@pauseを入れたような挙動を期待していたのですが、
@pauseのような挙動をする、スクリプトを書く必要がありそうです…残念…。
なお、実行するファイルの末尾に、「/exit」と記載することで、
実行後にコマンドプロンプトを、閉じるようにできるようですが、
コマンドプロンプト上で、結果を確認したい場合は、「/exit」はつけないほうが良いと思います。
ちなみに、このセッションは実行したスニペットの続きから、実行できますので、
よく使う設定や、import文を記載したスニペットを、あらかじめ用意しておくのが良いかもしれませんね。
4 最後に
いかがでしたでしょうか。
Java9には、他にもさまざまな機能が追加されていますので、
まずは、このJShellで新機能を試してみるのも良いかもしれませんね。