歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 在Java語言中執行JRuby

在Java語言中執行JRuby

日期:2017/3/1 9:42:38   编辑:Linux編程

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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved