天天看點

java調用ruby代碼

問題:

最近在做一個應用的時候碰到了一個問題。用戶端需要調用伺服器端傳回的腳本資訊,然後執行。其中腳本類型包括ruby。而java中調用ruby的代碼大緻如下:

java調用ruby代碼
java調用ruby代碼

1 String jrubyCode="puts 'hello world'";
2 ScriptEngineManager manager = new ScriptEngineManager();
3 ScriptEngine engine = manager.getEngineByName("jruby");
4 engine.eval(jrubyCode);      

JavaCallRuby

卻發現最後getEngineByName("jruby")老是傳回null。網上搜了很多解決辦法都沒有解決。

原因:

目前jdk裡面内嵌的好像隻有支援最基本的js調用的引擎,對于其他的腳本語言調用,需要用到對應的腳本引擎jar包。

解決辦法:

百度了很多都無果,最終google出了解決辦法。

1. 去jruby官網下載下傳最新的jruby工具包:http://jruby.org/download。(Linux直接下載下傳最新的tar.gz包,windows根據系統分别下載下傳64位或者32位包)

2. 安裝或者解壓對應的jruby到特定的目錄,并且模仿java_home設定jruby_home和path。

3. 引入解壓或者安裝之後程式lib目錄下的jruby,jar包到工程中。

PS: jdk1.7或以上。

知其然還要知其是以然,接下來我們來解析為什麼需要上面三個步驟。

其實可以發現此jruby.jar包中有一個org.jruby.embed.jsr223目錄,該目錄結構大緻如下圖所示:

java調用ruby代碼

我們可以看到JRubyEngineFactory的實作,注意其getScriptEngine方法,裡面有用到ScriptContainer,這表示一個腳本容器。檢視該類對應的構造方法:

java調用ruby代碼

可以看到其構造方法調用了initRubyInstanceConfig方法,該方法根據JRUBY_HOME對應的路徑去找對應的jruby執行個體。這就完美的說明了前面三個步驟的原因。

黎明前最黑暗,成功前最絕望!