JShellをもっと便利にするツール
JShellはツールとしての利用だけではなく、jdk.jshellというパッケージ名でAPIとしても提供されています。
今回はこれらのAPIの利用方法を紹介しませんが、APIを使ってJShellを拡張したプロジェクトがGitHubにありました。ここではそれらを紹介します。
これらのプロジェクトをそのまま使っても便利ですが、自分でJShellを拡張したい場合にも、大変参考になるプロジェクトだと思います。
Apache Mavenのアーティファクト情報でライブラリを追加できるJShell拡張
コードのビルドでApache Maven(以下、Maven)やGradleを使うことに慣れてしまうと、必要なライブラリをダウンロードしてjarファイルを配置すること自体が面倒になるケースがあります。
また、最近のプロジェクトでは、 MavenやGradle以外の方法ではビルド済みのjarファイルをどうやってダウンロードすればいいのかわからないプロジェクトも増えています。
「Try artifact」は、Mavenが使っているアーティファクト情報を利用し、必要なライブラリをコマンドから追加できるため、こうした問題を簡単に解決できます。
実際にMySQLのJDBCドライバを取得し、取得したコードを使う実行例がリスト13です。
java -jar try-artifact-0.2.1.jar | Welcome to JShell -- Version (version info not available) | Type /help for help -> /resolve mysql:mysql-connector-java:jar:5.1.6 // (1) | Path /Users/musvia/.m2/repository/mysql/mysql-connector-java/5.1.6/mysql-connector-java-5.1.6.jar added to classpath -> Iterator<java.sql.Driver> i = ServiceLoader.load(java.sql.Driver.class).iterator(); // (2) | Added variable i of type Iterator<java.sql.Driver> with initial value java.util.ServiceLoader$3@3159c4b8 -> i.next(); | Expression value is: com.mysql.jdbc.Driver@3b084709 | assigned to temporary variable $2 of type java.sql.Driver
(1)ではMySQLのJDBCドライバのアーティファクト情報を指定しています。追加したいライブラリを取得する指定方法が不明の場合、Maven Repositoryなどから調べることができます。そして、(2)のように追加したライブラリをインポートすることなく、すぐに利用することができます。
JavaFXのコードを簡単に確認できるようにするJShell拡張
JavaFXでのコードをJShellで確認したい場合、そのままではjava.lang.ExceptionInInitializerErrorエラーが発生してしまい実行ができません。
この問題を解決し、簡単にJavaFXのコードを確認できるようしたJShellが「JavaFXSupportsForJShell」です。
こちらのプロジェクトはコンパイル済みjarファイルを公開していないため、自分でソースを取得してビルドする必要があります。
実際に確認するにはリスト14のように空のJavaFXのウィンドウを作成し、そこに自分で確認したいGUI操作を記述します。そのため、GUIコンポーネントなどの動作を比較的容易に確認できます。
また同様の手法で、自分で作成したJavaFXアプリをJShellを通じて簡単に確認できるのではないかと思います。
VBox root = new VBox(10);
Scene scene = new Scene(root,640,480);
Stage stage = new Stage();
stage.setWidth(640);
stage.setHeight(480);
stage.setTitle("JavaFx JShell")
stage.setScene(scene);
stage.show();
// ここからJShell上で実際に確認をする
// Button b = new Button("test");
// root.getChildren().add(b);
// import javafx.scene.control.Alert.AlertType;
// b.setOnAction(s -> {
// Alert al = new Alert(AlertType.INFORMATION);
// al.show();
// });
このスクリプトを実行した結果が図2です。UIコンポーネントの見た目などを確認したい場合には便利なツールといえるでしょう。
最後に
今回はJShellを紹介しました。既存のJavaの開発者にとって、JShellは必ずしも満足できるものではないかもしれません。しかし、初心者にとってはJavaの学習コストが下がるなどのメリットがあるでしょう。また、JShellは拡張することもできるため、利用したいプロジェクトに即したカスタマイズをすることが可能です。
次回からはReactive Streamsなど、Java 9におけるAPIの変更点を中心に紹介します。
