ruby一種動態語言,而JRuby是純java實現的ruby語言。JRuby使用ruby語法開發。不僅可以使用ruby類庫,同時也可以使用java基礎類庫和第三方jar包。
舉一個hello world的例子:
ruby語言
puts "hello world"
jruby語言
include Java
java.lang.System.out.println "hello world"
使用jruby開發 swing
include Java
import java.lang.Boolean
import java.lang.System
import javax.swing.JFrame
import javax.swing.JButton
import java.awt.Dimension
frame=JFrame.new
frame.set_default_close_operation JFrame::EXIT_ON_CLOSE
button = JButton.new("button")
button.add_action_listener do |evt|
javax.swing.JOptionPane.show_message_dialog(nil, <<EOF)
you click me #{System.identity_hash_code evt}
EOF
end
frame.get_content_pane.add button
frame.set_minimum_size Dimension.new(200, 200)
frame.set_location_relative_to nil
frame.set_visible true
運行截圖
swing為了監聽事件通常要寫很多匿名內部類,我覺得這是java語言的弱點。ruby有block和閉包,那麼使用jruby開發swing就能解決這個問題。
好吧,讓我們切入正題。有時候我們需要利用不同語言的特性解決不同的問題,比如用java語言做開發,但有一個生成靜態頁面的模塊用jruby(我感覺在模板引擎這塊ruby遠遠要比java做的好,即使java有freemarker和velocity),我需要在合適的時機通過java調用jruby寫的模塊來生成頁面。
問題來了,怎樣通過java調用jruby寫的程序呢?
有三種方式可以解決這個問題(參考 RedBridge)
1 Embed Core
需要 jruby.jar
String jrubyCode="puts 'hello world'";
ScriptingContainer container = new ScriptingContainer();
container.runScriptlet(jrubyCode);
2 jsr223 Java Script Engine
如果jdk版本低於1.6需要 jsr223 api和 jruby.jar
或者jdk1.6 和jruby.jar
String jrubyCode="puts 'hello world'";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("jruby");
engine.eval(jrubyCode);
利用jsr223 Script Engine 可以調用許多動態語言,其中jdk原生還支持JavaScript(第一次在JavaScript中調用java類感覺有些激動)
3 BSF
需要BSF相關的jar與 jruby.jar
String jrubyCode="puts 'hello world'";
BSFManager.registerScriptingEngine("jruby", "org.jruby.embed.bsf.JRubyEngine", new String[] {"rb"});
BSFManager manager = new BSFManager();
manager.exec("jruby", "<script>", 0, 0, jrubyCode);
JRuby 的詳細介紹:請點這裡
JRuby 的下載地址:請點這裡