JDK6以降についているjrunscriptコマンドが付いている。
※最新のVer.8でもJREなら付いていない。
なぜか、JDK8のインストーラは
PATH変数に C:\ProgramData\Oracle\Java\javapath; を先頭に追加するが、そこには java.exe、javaw.exe、javaws.exe しかないので、コマンドプロンプトで使いたいJDKコマンドを、C:\ProgramData\Oracle\Java\javapath にショートカットかシンボリックリンクを貼れば良さそうだが、jrunscriptはjli.dllを参照しているので無理だったので、素直に環境変数を変えた方が良さそうだ。
新規に JAVA_HOME 変数を作り C:\Program Files\Java\jdk1.8.0_25 を設定。
PATH 変数の最後に ;%JAVA_HOME%\bin を追記。
※本当は正しい方法が別にあるのかもしれない。
※もし、C:\ProgramData\Oracle\Java\javapathにシンボリックリンクなどを貼ったまま放置すると「エラー: メイン・クラスcom.sun.tools.script.shell.Mainが見つからなかったかロードできませんでした」となってしまうので消しておくこと。
パラメータを付けなければ、インタラクティブモード、つまり古式ゆかしい対話式でJavaScriptを実行してくれる。
対話式の注意点としは、for文など { ブロック形式 } を使う文法も一行に収めなければダメ。
> jrunscript
nashorn> for (i = 0; i< 10; i++ ) { printf(“%d”,i); }
0
1
2
3
4
5
6
7
8
9
nashorn>Ctrl+C
>
※nashornはJDK8のJavaScriptエンジンの名前。Java SE 7ではrhinoのハズ。
普通にJavaScriptを読ませたければ、
> jrunscript -f JavaScriptファイル名
とすれば、ファイル単位でスクリプトを評価するので、
for (i = 0; i< 10; i++ ) {
printf(“%d”,i);
}
も、ちゃんと読んでくれ、同じように実行してくれる。
これだけではシェルやBATファイルの代りにJavaScriptが使えるだけ、
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval("for (i = 0; i< 10; i++ ) { printf('%d',i); }");
とやるようで結局JNDIな面倒な呼び方はそのまんま。
ただ、メソッドに渡すパラメータが複雑怪奇な構造だと
evalで呼び出すのは面倒でInvokeDynamicやMethodHandlerを使えるのは便利な気もする。
//エンジンを探す
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// スクリプトで ほげ関数を 定義する.
engine.eval("function ほげ(message) { print(message); }");
// Javaから ほげ関数を呼び出す.
Invocable invocable = (Invocable)engine;
invocable.invokeFunction("ほげ", "hello");
またスクリプトで
var a = Java.type("クラスのフルパス名");
とJavaのクラスが容易に呼び出せる一方で
var IntArrayType = Java.type("int[]")
var arr = new IntArrayType(10);
と 配列の扱いはなかなか面倒なようだ。