在java语言中执行jruby
程序员文章站
2022-07-14 22:24:32
...
ruby一种动态语言,而JRuby是纯java实现的ruby语言。JRuby使用ruby语法开发。不仅可以使用ruby类库,同时也可以使用java基础类库和第三方jar包。
举一个hello world的例子:
ruby语言
jruby语言
使用jruby开发 swing
运行截图
swing为了监听事件通常要写很多匿名内部类,我觉得这是java语言的弱点。ruby有block和闭包,那么使用jruby开发swing就能解决这个问题。
好吧,让我们切入正题。有时候我们需要利用不同语言的特性解决不同的问题,比如用java语言做开发,但有一个生成静态页面的模块用jruby(我感觉在模板引擎这块ruby远远要比java做的好,即使java有freemarker和velocity),我需要在合适的时机通过java调用jruby写的模块来生成页面。
问题来了,怎样通过java调用jruby写的程序呢?
有三种方式可以解决这个问题(参考 RedBridge)
1 Embed Core
需要 jruby.jar
2 jsr223 Java Script Engine
如果jdk版本低于1.6需要 jsr223 api和 jruby.jar
或者jdk1.6 和jruby.jar
利用jsr223 Script Engine 可以调用许多动态语言,其中jdk原生还支持JavaScript(第一次在JavaScript中调用java类感觉有些激动)
3 BSF
需要BSF相关的jar与 jruby.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);