JrunScript

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);

と 配列の扱いはなかなか面倒なようだ。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA