Java8からJavaScriptを実行するjjsというコマンドが追加されました。
jjsには通常のJavaScriptの機能に加え、シェルスクリプトの機能も使えるようにする -scripting というオプションがあります。
Nashorn and Shell Scripting
さて、参照先にあるようにUNIXの場合は #!/usr/bin/jjs
や #!/usr/bin/env jjs
といったshebangで書き始めればシェルスクリプト機能を持ったJavaScriptを書けるようになります。
これをWindowsのバッチファイルでも同じようにバッチファイルの中にJavaScriptを書ける方法をお伝えします。
jjsバッチの書き方
ファイルの拡張子はbat、もしくはcmdとします。
改行コードはWindowsのCRLF、文字コードはUTF-8で作成します。
下記の例ではJavaのインストールフォルダを環境変数のJAVA_HOMEにセットしています。
rem:/*
@"%JAVA_HOME%\bin\jjs" -scripting "%~f0" %*
@exit /b %ERRORLEVEL%
*/
# ここからJavaScriptのコードを書く
print("こんにちは, Nashorn!");
"%JAVA_HOME%\bin\jjs"
の部分はPATHが通っていればjjs
だけでOKです。
1行目は出力されてしまいますが(JavaScriptで@を先頭につけてもエラーにならない方法があれば教えて下さい)、他の行はエラーにならないはずです。
jarをクラスパスに追加したい場合は2行目を
@"%JAVA_HOME%\bin\jjs" -scripting -cp \...\a.jar;\...\b.jar "%~f0" %*
と-cp(-classpath)オプションで指定できます。
Java FX
Java FXを使う場合は、jjsに-fxオプションを付けます。
http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/javafx.html#CEGGACGH のExample 3-4をバッチファイルにしてみます。
rem:/*
@"%JAVA_HOME%\bin\jjs" -fx -scripting "%~f0" %*
@exit /b %ERRORLEVEL%
*/
# Example 3-4 JavaFX Script Application with Loaded Scripts
load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");
$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();
実行するとボタンが1つあるウィンドウが開きます。
まとめ
実はこれで何かすることは何も思いつきませんし、素直にjsファイルをjjsで呼び出せばいい気もしますが、1つのバッチファイル内でJavaのクラスをJavaScriptで呼び出したい(奇特な)方がいましたらぜひお試しください。