これまで5回に渡ってProject Kullaが提供しているJShellについて紹介してきました。今回は少し趣向を変えて、JShellが使用しているライブラリーのJLineを紹介します。

 JLineはコンソールを制御するためのライブラリーです。Java SEではJShellと、JavaScriptエンジンのNashornがJLineを使用しています。

 Javaでコンソールを扱うとすれば、標準入出力であるSystem.inとSystem.outを直接扱うか、Java SE 6で導入されたjava.io.Consoleクラスを使用してきました。しかし、Consoleクラスでさえも、機能は必要最低限しかありません。例えば、履歴を扱うこともできません。

 これに対し、JLineはコンソールからの入出力だけでなく、履歴や補完などを扱うことが可能です。Java SE 9に含まれているJLineは、残念ながらJShellとNashornだけに限定公開されたモジュールとなっています。このため、JLineを使用するには、別途JLineをインストールする必要があります。

 なお、Java SE 9で使用されているJLineのバージョンは、既に開発が終了している2.12.1です。本記事ではJLineの最新バージョンである3.3を使用していきます。また、JLine 2.xとJLine 3.xではクラス構成やAPIが大幅に変更されています。この点は注意が必要です。

JLineのインストール

 JLineではバイナリーパッケージは公開されていません。GitHubのJLine 3プロジェクトをクローンして、ビルドする必要があります。また、Mavenのセントラルレポジトリーに登録されているJLineを使用することもできます。

 JLineのプロジェクトページには、Mavenの依存性記述の方法が記載されているので、そちらを参照してください。

 ここでは、前者の方法でビルドします。

 以下、WindowsでC:\jlineディレクトリでビルドした例を示します。ここでは、Cygwinのgitを使用しています。gitが使用できない場合、GitHubのJLine 3プロジェクトのページの右上部のボタンからZIPファイルをダウンロードできます(図1)。

図1●ZIPファイルのダウンロード
図1●ZIPファイルのダウンロード

 また、ビルドにはMavenが必要です。JLineのビルドにはJDK 8u121を使用しています。これ以降のサンプルでもJDK 8u121を使用しました。

C:jline>git clone git://github.com/jline/jline3.git
Cloning into 'jline3'...
remote: Counting objects: 11791, done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 11791 (delta 24), reused 0 (delta 0), pack-reused 11667
Receiving objects: 100% (11791/11791), 3.15 MiB | 700.00 KiB/s, done.
Resolving deltas: 100% (6046/6046), done.
Checking connectivity... done.
Checking out files: 100% (190/190), done.

C:jline>cd jline3

C:jlinejline3>mvn install

    <<以下、省略>>

 ビルドが完了すると、jline3ディレクトリにあるjline\targetディレクトリにjline-3.3.0-SNAPSHOT.jarが出来ているはずです。

 また、JLineを使用する場合、JNA(Java Native Access)も必要になります。JLineのビルド時にMavenのローカルレポジトリーにjna-4.2.2.jarがダウンロードされているはずなので、それを使用します。もしくは、JNAのプロジェクトページから直接JARファイルをダウンロードしておきます。

 JLineを使用するアプリケーションでは、これら2つのJARファイルをクラスパスに含めるようにします。