表記の通り、今(2015/06/26)現在KullaというプロジェクトでREPL機能が開発されていて、Java 9で(今更ながら)搭載される予定です(jshellと呼ばれるらしい)。

以前はこのJava REPLを試すのが大変だった(@zephiransasさんのブログ記事を参照)ようですが、今はかなり簡単に、ナイトリービルドを試すことができます。Kullaのコミッターの@bitter_foxさんのブログを参考にインストールが可能です。

とっても簡単なJava REPLの始め方 - きつねとJava！ d.hatena.ne.jp

概要を書くと…

Java 9 early access版を入手する

Project KullaのJenkinsから最新版の成果物を入手する

Java 9 eaにパスを通す( java -version で java version "1.9.0-ea" と出てくればよい)

で と出てくればよい) java -jar kulla-0.xxx-yyyymmddhhmmss.jar で起動する

で使うことができます。

以下は昨日(2015/06/25)の最新バージョンを元に書いてあります。

Javaのバージョン : 1.9.0-ea-b68

Kullaのバージョン : 0.610-20150625005844

起動の仕方

先ほども書いた通り、Java 9 eaにパスを通した上で、次のコマンドで実行できます。

$ java -jar kulla-0.610-20150625005844.jar | Welcome to JShell -- Version 0.610 | Type /help for help ->

終了の仕方

上の実行結果を見ればわかるとおり、ヘルプを表示する方法が /help とあり、それを呼び出せばよいのにもかかわらず、ヘルプを見る方法がわからなくて、 Ctrl + D で終了していたりしましたが、 /x で終了できます。

-> /x | Goodbye $

コマンド

上記にあるように /help あるいは /? で見ることができます。

内容は@yy_yankさんのブログでも見られます。

JavaのREPL、project kullaがスッゴイ便利！ - Javaプログラマーのはしくれダイアリー

恐らくよく使うものを再掲します。

コマンド(短縮形) コマンド コマンドの内容 /? /help ヘルプを表示する /x /exit Java REPLを終了する - ! 前回と同じ式 or コマンドを実行する

(下記の /-1 と同じ) - /-数字 指定した数の分前の式 or コマンドを

実行する /r /reset 入力したすべての変数、クラス定義

などをクリアする /h /history 入力した履歴を表示する /v vars 定義された変数を表示する /m /methods 定義されたメソッドを表示する /c /classes 定義されたクラスを表示する /o <file-name> /open <file-name> 指定したテキストファイルを読み込み

コンパイルする /cp <path> classpath <path> ライブラリーを読み込む - seteditor <editor-name> 外部エディターを指定する /e <name> /edit <name> 指定した変数やクラスなどの定義を

指定した外部エディターで

編集する

(設定していない場合は

JShellTool というSwingっぽいエディター) `/d /drop <name> 指定した変数やクラスなどを

クリアする /s [all or history] <file-name> save [all or history] <file-name> 入力した履歴をすべて( all )

あるいはヒストリーだけ( history )、

指定したファイルに保存する - /setstart <file-name> 指定したファイルを初期ロード定義

として読み込む

( /r 実行の後に有効になる) - /savestart <file-name> 指定したファイルにデフォルトの

初期ロード定義を書き込む /p /prompt プロンプトの前にある -> の表示有無を

切り替える

よく使うものだけと言ってたけど、全部書いちゃった(・ω<)

個人的には、scalaとかgroovyshとかghciを使ってて、

:q -> 終了

-> 終了 :l -> ファイルのロード

的な動作に慣れてしまっているので、合わせてもらいたかった気がしなくもなくもない…

【2015/06/27 15:08 補足】scalaは :quit だった…。まあ、ここで言いたいのは、多くのREPLが : で始まっていて、Kullaが / で始まることにちょっと違和感を感じているということです

とりあえず使ってみる

では、単純に使ってみたいと思います。

-> 1 | Expression value is: 1 | assigned to temporary variable $1 of type int

式 1 を実行することで 1 が得られて、それが変数 $1 に代入されました。 /r を実行しない間は、以前の式の実行結果はこの $1 的な変数でアクセスすることができます。

-> 1 + 1L + 1_000l | Expression value is: 1002 | assigned to temporary variable $2 of type long

Java7から導入された数値の途中の _ も使うことが可能です。

-> $2 = 100 | Variable $2 has been assigned the value 100

あ、実行結果の変数に別の値を代入できちゃうんだ…(´・ω・｀)

実行結果の変数はなるべく final っぽくしてほしかった気がしなくもなくもないですね…

-> URL url = new URL("http://mike-neck.hatenadiary.com/") | Added variable url of type URL with initial value http://mike-neck.hatenadiary.com/ -> URI uri = url.toURI() | Added variable uri of type URI with initial value http://mike-neck.hatenadiary.com/

URL#toURI は URISyntaxException という検査例外が投げられる可能性のあるメソッドなのですが、特にtry-catchを入れなくても実行できます。もちろん、try-catchで実行することも可能です。なお、try-catchの中のブロックでは式は ; で終了する必要があります。

-> try { >> URL u = new URL("https://google.com"); >> URI i = u.toURI(); >> printf(i.toString()); >> } catch (URISyntaxException e) { >> printf(e.toString()); >> } https://google.com

ファイルを読み込む

さて、現在 foo というディレクトリーにいて、 foo ディレクトリーがこのような構造であるとします。

foo ┗ sample ┗ 00-sample.txt

そして、 00-sample.txt の中身をこんな感じで自分自身を文字列として読み込む風にしておきます。

import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.charset.StandardCharsets Path sample = Paths.get( "sample/00-sample.txt" ) List<String> list = Files.readAllLines(sample, StandardCharsets.UTF_8)

これを /o コマンドで読み込みます。

-> /r | Resetting state. -> /o sample/00-sample.txt -> /v | Path sample = sample/00-sample.txt | List<String> list = [import java.nio.file.Files, import java.nio.file.Path, import java.nio.file.Paths, import java.nio.charset.StandardCharsets, , , Path sample = Paths.get("sample/00-sample.txt"), List<String> list = Files.readAllLines(sample, StandardCharsets.UTF_8)]

見事に読み込めたようですね。

jarファイルを読み込む

jarファイルなどを読み込んで試すこともできます。

とりあえず、先ほどの foo ディレクトリーの下に次のようにtwitter4jを置いておきます。そしてKullaを起動します。なお、twitter4j.propertiesにはconsumer key、secret、access token、token secretを記述しておきます。

foo ┣ twitter4j-core-4.0.4.jar ┗ twitter4j.properties

次のようにコマンドを書いていきます。

-> /cp twitter4j-core-4.0.4.jar | Path twitter4j-core-4.0.4.jar added to classpath -> import twitter4j.TwitterFactory -> import twitter4j.Twitter -> Twitter twitter = TwitterFactory.getSingleton() | Added variable twitter of type Twitter with initial value TwitterImpl{INCLUDE_MY_RETWEET=PostParameter{name='include_my_retweet', value='true', file=null, fileBody=null}} -> twitter.updateStatus("project Kullaからツイート") | Expression value is: StatusJSONImpl{createdAt=Fri Jun 26 15:58:21 JST 2015, id=614326819064418305, text='project Kullaからツイート',...省略 | assigned to temporary variable $1 of type twitter4j.Status ->

これでツイートしたツイートがこちらになります。

project Kullaからツイート — 持田真哉 (@mike_neck) June 26, 2015

jarファイルも読み込めることがわかりました。これは、プロジェクトで作成したjarファイルをちょこっと試してみたいときなどに有効かもしれません。

【2015/06/27 15:08 追記】 さらにはJavaをスクリプトとして使うこともできるかもしれませんね

project Kullaはまだ開発中ですので、今後動作が変わってくるかもしれませんが、教育用途やちょっとしたテスト用途、およびちょっとしたスクリプトの実行に用いることができそうです。また、今回は試していませんが、Jettyなどのwebサーバーを起動して、ちょっとしたwebサーバーのモックとしても使うことができるかもしれません。

おわり