実際に、 Javaプログラムからスクリプト言語を動かしてみましょう。ここからは、例としてRubyのJava実装であるJRubyを利用していきます。 Javaの開発・実行環境であるJava Development Kit(JDK)をオラクルのWebサイトからダウンロードして、インストールを済ませておいてください。 JRubyの詳しい導入方法は、別掲記事の開発環境のインストールを参考にしてください。 JRubyは、RubyをJVM上で動かすために作られました。 Rubyとの互換性を重視したスクリプト言語なので、Rubyのプログラムをほぼ同じようにJVMで動かすことができます。

 JavaからJRubyコードを動かす方法は、(1)Java SE 6から導入されたScripting for Java Platformを使う、(2)JRubyのJARファイルを利用する、(3)ApacheプロジェクトのBean Scripting Frameworkを使用する、という主に三つの方法があります。ここでは、(1)と(2)の方法についてみていきましょう。

 (1)の方法で、 JavaからJRubyのコードを呼び出すには、リスト2のように記述します。ポイントは、ScriptEngineManagerクラスとScriptEngineインタフェースです。この二つがあれば手軽にJavaからスクリプト言語を呼び出すことができます。ScriptEngineManagerクラスでは、どんなスクリプト言語が使用できるかを管理しています。 ScriptEngineインタフェースの検出やインスタンス化も担当します。一方のScriptEngineインタフェースは、スクリプト言語を処理するエンジンの機能を提供します。

リスト2●JavaからJRubyのプログラムを呼び出す
リスト2●JavaからJRubyのプログラムを呼び出す
[画像のクリックで拡大表示]

 リスト2を順番に説明します。まず、実行したいJRubyのプログラムを準備しています。次の行では、ScriptEngineManagerクラスをインスタンス化しています。インスタンス化したScriptEngineManagerオブジェクトには、スクリプトエンジンを生成するためのjavax.script.ScriptEngineインタフェースのインスタンスが登録されています。

 ScriptEngineManagerオブジェクトは、登録されたScriptEngineオブジェクトにスクリプトエンジンの生成を委譲します。ここで、どのようなスクリプトエンジンが生成されるのか事前にわからなければなりません。そのため、ScriptEngineインタフェースには、生成するスクリプトエンジンに関する情報を取得するためのメソッドが定義されています。そのメソッドがgetEngineByNameです。ここでは、「jruby」を引数にすることで、JRuby用の処理エンジンを準備しています。

 最後に、engineオブジェクトのevalメソッドで、JRubyのプログラムを受け取り実行しています。 evalメソッドは、引数に受け取った文字列を実行してくれるものです。リスト2では、指定した「puts 'Hello JRuby!'(putsは文字列を表示するメソッド)」のプログラムを実行しています。

 ちなみに処理エンジンを準備する段階で、引数に“javascript”を取れば、JavaScriptの実行エンジンが用意されます。 JavaScriptの場合は、標準APIにRhino(ライノと読みます)というJavaScriptのJava実装が含まれているので、 JRubyのように追加のJARファイルは必要ありません。リスト3のように記述すれば、 JavaScriptを動かすことも可能です。ここでは、日付を出力するJavaScriptのプログラム「"println(new Date());"」を実行しています。リスト2の(1)の部分をリスト3と置き換えるだけで動かすことができます。

リスト3●JavaからJavaScriptを呼び出すプログラム
リスト3●JavaからJavaScriptを呼び出すプログラム
[画像のクリックで拡大表示]