在java语言中执行jruby

在java语言中执行jruby - 积累 - ITeye技术网站

    ruby一种动态语言,而 JRuby是纯java实现的ruby语言。JRuby使用ruby语法开发。不仅可以使用ruby类库,同时也可以使用java基础类库和第三方jar包。

举一个hello world的例子:

ruby语言


Ruby代码   收藏代码
  1. puts "hello world"  
puts "hello world"


jruby语言


Ruby代码   收藏代码
  1. include Java  
  2. java.lang.System.out.println "hello world"  
include Java
java.lang.System.out.println "hello world"




使用jruby开发 swing


Java代码   收藏代码
  1. include Java  
  2. import java.lang.Boolean  
  3. import java.lang.System  
  4. import javax.swing.JFrame  
  5. import javax.swing.JButton  
  6. import java.awt.Dimension  
  7.   
  8. frame=JFrame.new  
  9. frame.set_default_close_operation JFrame::EXIT_ON_CLOSE  
  10. button = JButton.new("button")  
  11. button.add_action_listener do |evt|  
  12.   javax.swing.JOptionPane.show_message_dialog(nil, <<EOF)  
  13. you click me #{System.identity_hash_code evt}  
  14. EOF  
  15. end  
  16. frame.get_content_pane.add button  
  17. frame.set_minimum_size Dimension.new(200200)  
  18. frame.set_location_relative_to nil  
  19. frame.set_visible true  
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


Java代码   收藏代码
  1. String jrubyCode="puts 'hello world'";  
  2. ScriptingContainer container = new ScriptingContainer();  
  3. container.runScriptlet(jrubyCode);  
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


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


利用jsr223 Script Engine 可以调用许多动态语言,其中jdk原生还支持JavaScript(第一次在JavaScript中调用java类感觉有些激动)





BSF

需要BSF相关的jar与 jruby.jar


Java代码   收藏代码
  1. String jrubyCode="puts 'hello world'";  
  2. BSFManager.registerScriptingEngine("jruby""org.jruby.embed.bsf.JRubyEngine"new String[] {"rb"});  
  3. BSFManager manager = new BSFManager();  
  4. manager.exec("jruby""<script>"00, jrubyCode);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值