Scripting for the Java™ Platform

2008年03月01日
Scripting for the Java™ PlatformJSR 223 で標準化され Java SE 6 から使用できるようになったスクリプト API です。標準で JavaScript (ECMA Script; JSE 6 時点で 1.6) を使用することが出来ます。

Scripting for the Java™ Platform

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

実行環境で使用できるスクリプトは以下のコードで確認することが出来ます。

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());
}
Java SE 6
[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]

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

簡単な使い方

基本的な使い方は ScriptEngineManagerJava™ API リファレンス からスクリプトの言語名や拡張子、MIME-Type などを指定して ScriptEngineJava™ API リファレンス を取得し、eval() メソッドで実行を行います。

Java
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 以外で開発されているスクリプト言語でも拡張機能機構Google I'm Feeling Lucky™ を使用して Scripting API に追加が可能です。

CVS 2008/03/15