Scripting for the Java™ Platform

Takami Torao Java 6
  • このエントリーをはてなブックマークに追加

Scripting for the Java™ PlatformJSR 223 で標準化され Java SE 6 から導入されたスクリプト API。文字列や外部ファイルに記述されているスクリプトを Java 上で実行することができる。

実行環境でどのようなスクリプト言語が使用できるかは以下のコードで確認することができる。

// 実行環境でどのようなエンジンが使用できるか確認
ScriptEngineManager manager = new ScriptEngineManager();
for(ScriptEngineFactory f: manager.getEngineFactories()){
	System.out.printf(
		"[%s/%s] %s/%s%n  name=%s%n  ext=%s%n  mime=%s%n",
		f.getEngineName(), f.getEngineVersion(),
		f.getLanguageName(), f.getLanguageVersion(),
		f.getNames(), f.getExtensions(), f.getMimeTypes());
}

Windows の Java SE 6 では Rhino と呼ばれる JavaScript (ECMAScript) エンジンが標準バンドルされている。

[Mozilla Rhino/1.6 release 2] ECMAScript/1.6
  name=[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
  ext=[js]
  mime=[application/javascript, application/ecmascript, text/javascript, text/ecmascript]

ただし全ての環境で Rhino が使えるというわけではなく、Mac OSX 10.5 の JSE6 では AppleScript が標準となっている (Rhino はバンドルされていない)。

[AppleScriptEngine/1.0] AppleScript/2.0.1
  name=[AppleScriptEngine, AppleScript, OSA]
  ext=[scpt, applescript, app]
  mime=[application/x-applescript, text/plain, text/applescript]

簡単な使い方

基本的な使い方は ScriptEngineManager からスクリプトの言語名や拡張子、MIME-Type などを指定して ScriptEngine を取得し、eval() メソッドで実行する。

private static final ScriptEngineManager manager = new ScriptEngineManager();

// ...
ScriptEngine engine = manager.getEngineByName("JavaScript");
try{
  engine.eval("println('hello, world');"); // 標準出力へ
} catch(ScriptException ex){
  ex.printStackTrace();
}

同一の ScriptEngine に対して eval() を複数回実行することができる。この場合、以前の呼び出しで宣言した変数や関数などが次回以降の呼び出しに引き継がれる。

eval() はスクリプト内の最後のステップの評価結果を返す。このためスクリプトから Java にオブジェクトを返すには return ではなく値そのものやそれを導出する式、関数などで記述する。

API リファレンス も参照。

スクリプト言語の追加

Rhino を含めてさまざまなスクリプト言語の開発が java.net で行われており、Script API で利用することができる。

  1. 利用するスクリプト言語のライブラリをダウンロードする。
  2. java.net から jsr223-engines.zip をダウンロードする。この中にプロジェクトで開発されているスクリプト言語の JSR 223 エンジンが含まれている。
  3. 必要な言語のエンジン (xxx-engine.jar) を取り出してスクリプト言語のライブラリと一緒にクラスパスへ追加し、Script API を使用するアプリケーションを実行する。

java.net 以外で開発されているスクリプト言語でも拡張機能機構を使用して Scripting API に追加が可能。