Java8以降では、Rhinoに代わり、NashornがJavaScriptエンジンとして利用可能になっています。そこで、ここでは、Nashornを始めるにあたり、Rhinoとの差異などをまとめてみます。

Nashornの実行ファイル名は「jjs」です。JREおよびJDKのbinディレクトリに「jjs」というファイルが用意されています。そのため、環境変数「JAVA_HOME」を設定するか、「jjs」のあるフォルダにパスを通すことでjjsを実行できるようにしておきましょう。

Windowsでは、環境変数の設定から「JAVA_HOME」を設定します。そして、Nashornを実行するバッチファイルは次のようになります。

"%JAVA_HOME%\bin\jjs" %*

Mac OS Xでは、JRE(またはJDK)のbinディレクトリにある「jjs」へシンボリックリンクを張るか、JAVA_HOMEを設定し、そこからbin/jjsを実行できるようにします。シンボリックリンクを張る場合は、下記のようにパスの通ったディレクトリを指定します。

JAVA_HOME=`/usr/libexec/java_home -v 1.8`
ln -si $JAVA_HOME/bin/jjs /usr/local/bin/jjs

また、JAVA_HOMEを設定する方法では、/usr/libexec/java_homeコマンドが利用できます。Nashornを実行するだけの簡単なシェルスクリプトは、次のようになります。以下をパスの通ったフォルダに「jjs」などの名前で保存します。

#!/bin/sh
JAVA_HOME=`/usr/libexec/java_home -v 1.8`
$JAVA_HOME/bin/jjs $@

引数を付けずに実行すると、インタプリタが起動して、計算などを対話的に実行できます。

$ jjs
jjs> 3 + 5
8

RhinoのreadFile()メソッドがない?! *

Rhinoでは手軽にファイルが読み込めるreadFileメソッドがありましたが、Nashornでは使えません。とはいえ、以下のようなメソッドを定義してあげれば良いだけです。

// Rhino互換のreadFileメソッド
function readFile(fname, charset) {
  var Files = java.nio.file.Files;
  var Paths = java.nio.file.Paths;
  
  var bytes = Files.readAllBytes(Paths.get(fname));
  var text = new java.lang.String(bytes, charset);
  return "" + text;
}

// Shift_JIS(MS932)のテキストファイルを読み込む例
var txt = readFile("test.txt", "MS932");
print(txt);

readFile()に近いメソッド、readFully()もありますが、これは、スクリプトモード(オプションに「-scripting」を付ける)でNashornを実行した時に有効になります。

var text = readFully("text.txt");
print(text);

参考 *