こんにちは。
キャスレーコンサルティング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");

20171217_001
できましたね。
新しいプログラムを動かすときのド定番となる、プログラムですが、
Javaの場合、Eclipse無しで実行するのは、意外と面倒だとと思います。

それがJShellなら、たった2行打ち込むだけで実行できてしまうのは、素晴らしいと思います。

続いて、1+1を打ち込んでみます。

20171217_002
$1 ==> 2 と表示されました。
JShellでは、このような左辺(代入先)を省略した式を実行すると、自動的に変数を作成してそこに代入してくれます。

変数なので、次のように以降の処理で、使用することもできます。

20171217_003

なお、当然ですが、$1(int)と$4(String)を計算することはできませんが、+演算子による文字列結合は可能です。
現在使用可能な変数を確認するには、/varコマンドを使用します。

コード補完

EclipseなどのIDEでは、お馴染みのコード補完もできます。

次は、f.liまで入力して、Tabキーを押下した場合の動きです。

20171217_004
EclipseではCtrl+Spaceを打つところで、JShellはTabキーを押下すれば、候補が表示されます。
以降の文字の候補が、1つに絞られる場合は、自動的に入力されます。

クラス・メソッド定義

JShell上で、クラス宣言をして使用してみましょう。
20171217_005
名前が”test”で始まっている、ファイルを抽出するフィルターですが、きちんと動作していますね。

なお、ある程度補完できるとしても、クラス宣言をJShell上で打ち込むのは結構大変なので、
JShellの/Openコマンド(後述)を使用するのが、良いと思います。

import追加

さて、今までで実行した処理で、import宣言をまったくしていなかったのに、お気づきでしょうか。

JavaでFileクラスを使うには、java.io.Fileのimport宣言が必要ですが、
JShellでは標準で以下がimportされているので、
その中のクラスを使用するだけであれば、import宣言を行う必要はありません。

20171217_006

当然、上記以外のクラスを使う場合は、import宣言を行う必要があります。
試しに、Swingのクラスをimportして、ファイル選択ダイアログを表示してみましょう。
(javaFXじゃなくてごめんなさい)

20171217_007

表示されたダイアログがこちら

20171217_008

問題無く、ファイル選択ダイアログの内容を、取得できました。

2.2 実行したスクリプトの読込/保存

先ほどJShell上で宣言した、MyFilenameFilterですが、
クラス宣言や、メソッド宣言は最後の大括弧(”}”)を入力した時に、入力した内容の評価が行われるため、
途中で打ち間違えた場合に、最後まで気づくことができません。

そして、打ち間違いが無くなるまで、延々とトライ&エラーを、繰り返すことになります。
Javaの開発で、秀丸大先生がご活躍されていた時代を思い出して、思わず涙がでました。
これでは、せっかくのJShellも台無しなので、打ち間違いのリスクを極力減らしましょう。
(コーディングの間違いは、頑張りましょう)。

JShellには、テキストファイルを読み込んで、実行する機能(/Open)があります。
先ほど宣言した、MyFilenameFilterをテキストファイルに、記載します。

20171217_009

そして、このテキストファイルを、JShellから読み込みます。

20171217_010
先ほどのクラス宣言を、テキストファイルから、実施することができました。

3.スニペットのカンタン起動

JShellは、とてもカンタンにJavaのコードを勉強できるのが魅力ですが、
いざ実際に仕事で使うと、イマイチ活躍できる場面が想像できません…(私の想像力が無いだけかもしれませんが…)

やはり、コンパイルなしでJavaのコードを実行できる利点を生かして、
業務上よく使う処理を、スニペットとして保存しておき、すぐに実行できるようにすることで、
Java9の開発環境さえあれば、プラットフォームを選ばずにどこでも動く、
シェルスクリプトのようなものを、作れるのかと思いました。

そこで、少し本題からずれますが、Windows環境でエクスプローラーからダブルクリックで、
JShellを起動できるようにする設定を、してみたいと思います。

3.1 拡張子とデフォルトで開くアプリの設定

現状JShellの拡張子は、特に決まっていないようですので、こちらで決めてしまいましょう。
ここでは、「.jsh」としてみました。

拡張子「.jsh」のプロパティから開くアプリを、JShellの実行ファイルに設定します。

これで拡張子「.jsh」のファイルを、ダブルクリックすると、コマンドプロンプトとJShellが起動するはずが…
20171217_011
なぜか、実行したあとに、jshellのセッションが始まってしまいました…
DOSバッチなどで、@pauseを入れたような挙動を期待していたのですが、
@pauseのような挙動をする、スクリプトを書く必要がありそうです…残念…。

なお、実行するファイルの末尾に、「/exit」と記載することで、
実行後にコマンドプロンプトを、閉じるようにできるようですが、
コマンドプロンプト上で、結果を確認したい場合は、「/exit」はつけないほうが良いと思います。

ちなみに、このセッションは実行したスニペットの続きから、実行できますので、
よく使う設定や、import文を記載したスニペットを、あらかじめ用意しておくのが良いかもしれませんね。

4 最後に

いかがでしたでしょうか。
Java9には、他にもさまざまな機能が追加されていますので、
まずは、このJShellで新機能を試してみるのも良いかもしれませんね。