なぜこれが必要?
RubyをインストールできないPCでJavaはOKとなると、JRubyを使おうという選択肢が出てきます。ただ、起動するのに時間がかかる。
このため、以下のようなGUIを作ってJVM環境を作っておいて、Rubyスクリプトや、処理するためのデータを書き換えればいいのかなと思った。
今回は、このGUIの作り方は省略しますが、このJavaアプリからJRubyを呼び出し、スクリプトを実行させる方法だけやってみます。
必要なもの
- JRuby本体 jruby-complete-9.4.3.0.jar を使いました
- このサンプルでは log4j2を使用しています
GEM_HOMEは $HOME/JGEM にあることにしています。
このため、以下のような形で、事前に必要なRubyライブラリーを入れておきます
(ドキュメント生成を省略するため -N としています)
GEM_HOME=/home/XXXXX/JGEM java -jar jruby-complete-9.3.6.0.jar -S gem install ライブラリー名 -N
書いてみる
/**
* JRubyスクリプトをJavaから呼び出す
*
* @param inputData 処理するデータ(文字)
* @param script Rubyスクリプト本体
* @return 処理結果
*/
String execRubyScript(String inputData, String script) {
// 処理結果を格納
String out;
// JRuby
ScriptingContainer jruby = new ScriptingContainer();
// 処理したいデータを標準入力として入れる
logger.debug("スクリプトに渡す文字列:" + inputData);
if (!inputData.isEmpty()) {
String[] stdin = new String[1];
stdin[0] = inputData;
jruby.setArgv(stdin);
}
// この一行がないと二度目の実行に影響が出た
jruby.terminate();
// GEM_HOMEの場所を指定
String gemHome = System.getProperty("user.home") + File.separator + "JGEM";
jruby.callMethod(jruby.runScriptlet("Gem"), "use_paths", gemHome, gemHome);
// スクリプトの実行
try {
Object runScriptlet = jruby.runScriptlet(script.strip());
out = runScriptlet.toString();
logger.debug("スクリプト実行結果:" + out);
} catch (Exception e) {
logger.debug("スクリプト実行失敗:" + e.getMessage());
out = e.getMessage();
}
return out;
}
追記
Rubyスクリプトに変数を渡す方法は、標準入力を使う方法以外もあると思います。
https://tyfkda.github.io/blog/2015/03/08/jruby-from-java.html
こちらのサイトを参考にさせていただきました。ありがとうございました。