锁定老帖子 主题:当Ruby遇到Java,勇敢地跨越边界吧
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-24
1. 引言 2. JRuby的Java集成 2.1. JRuby中调用Java require 'java' java::java.util.ArrayList Java类的使用也有几种选择: include_class "java.util.HashMap" x = HashMap.new x.put("foo","bar") include_class("java.lang.String") {|pkg,name| "JString"} y = JString.new "Hello, world" 如果类是在java、javax、org或者com包中的,那还可以直接引用它们。 JString = java.lang.String y = JString.new "Hello, world" 你可以这样来调用System.out.println: java.lang.System.out.println("Hello, world") 值得一提的是这里的”Hello, world”是Ruby的字符串,而非java.lang.String,JRuby会自动对一些类型进行转换,开发者无需自己动手。 [1,2,3].to_java :float # new float[] {1,2,3} ["str", "str2"].to_java java.lang.String # new String[]{"str","str2"} 常用的symbol有以下几种::boolean、:byte、:char、:double、:float、:int、:long、:short、:object、:string、:big_decimal(:decimal)和:big_integer(:big_int)。 如要直接创建并使用Java数组,像下面这样就行了: java.lang.String[3].new java.lang.String[].new [3,3] java.lang.String[3][3].new d = java.lang.String[3,3].new d[0][0] = "Hello" d[0][1] = "World" 2.2. 扩展Java class Compare import java.lang.Comparable def compareTo o this <=> o end end 如果要实现多个接口,import就可以了,对于未实现的方法,JRuby会把它交给method_missing。有一点要注意,compareTo在这里不能写成compare_to。 class MyStringBuffer < java.lang.StringBuffer def append(v) end end StringBuffer类的append方法有多个overload的版本,接收多个不同类型的参数,它们都会被统一到这个唯一的方法上,理由嘛很好理解,不是吗? 2.3. Java中调用JRuby import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class JRubyJSR223 { public static void main(String[] args) throws Exception { ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine rubyEngine = m.getEngineByName("jruby"); rubyEngine.getContext().setAttribute("num", new Integer(4), ScriptContext.ENGINE_SCOPE); rubyEngine.eval("puts 2 + $num "); } } 3. JRuby on Rails项目的部署 3.1. Java EE Web容器中的部署 jruby -S rake war:standalone:create 下面来介绍些war.rb配置时的DSL: 写道 exclude_files FILENAME 用来指定不想被放入War的文件,可以使用通配符。 servlet CLASSNAME 分派Rails请求的类,默认是org.jruby.webapp.RailsServlet。 compile_ruby BOOLEAN 打包前编译所有的Ruby文件,目前这个功能似乎还不是很理想,所以默认是false。记得Robbin以前曾发过一篇文章说突然发现XRuby做的事情很有前途,JRuby同样能够做到,其实我不在乎用什么,只要把我的Ruby代码编程字节码就行。 add_gem NAME, VERSION 你需要手动添加程序用到的Gem包,好在有add_gem_dependencies,把它设为true(默认就是true),GoldSpike会自动添加依赖的包的。 add_gem 'RedCloth', '= 3.0.4' datasource_jndi BOOLEAN 如果在程序中使用了JNDI提供数据源,那将这个参数设置为true,并用datasource_jndi_name NAME来提供JNDI名称,JRuby on Rails中可以用ActiveRecord-JDBC来访问数据库,其中能够使用JNDI。 maven_library GROUP, NAME, VERSION 项目中如果需要Jar库,GoldSpike可以直接从Maven库中下载文件。 maven_library 'mysql', 'mysql-connector-java', '5.0.4' GoldSpike是JRuby-extras的一部分,欲了解相关信息,请访问https://rubyforge.org/projects/jruby-extras/ ,其中还有ActiveRecord-JDBC等信息。此外,由Nick Sieger开发的Warbler也是一个不错的选择。 3.2. Mongrel集群 jruby -S mongrel_rails jcluster::configure -e production -p 4000 -c . -N 4 -R 20202 -K yourVerySecretKey jruby -S mongrel_rails jcluster::start jruby -S mongrel_rails jcluster::stop 第一条命令会创建一个配置文件,启动4个Mongrel实例,端口从4000开始,JRuby通过20202端口来监听发送的命令(JRuby自己起了个服务器,接收命令,在一个JVM里运行),-K是服务器用的密钥。 4. 总结 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-24
Sorry, cant type Chinese on this machine.
However, from InfoQ, a news said: some guys more encourage Sun company investing on groovy rather than jruby, they said the fundamental part on jruby is a mess ... I dont know if this is true, but groovy grows even faster than jruby these days. |
|
返回顶楼 | |
发表时间:2008-01-24
我也用过Groovy,它出来后没多久就变成JSR了,语法发生了些变化,它比起JRuby与Java的结合更紧密,其实各有个的好,Groovy也有Grails就看你怎么用了。
再说,Grovvy可以自顾自的发展,JRuby还要时刻注意与C Ruby兼容,保证Rails能跑在上面,兼容性比较重要,步伐慢点我觉得可以理解,Ruby 1.9刚发,好戏应该还在后面吧,呵呵~ P.S. 刚才去infoq看了下,你说的那篇是请愿:Sun,请停止支持JRuby吧,感觉把在JRuby上投资说成浪费时间有点偏激了~ |
|
返回顶楼 | |
发表时间:2008-01-24
对 Jruby性能问题似乎遇到了瓶颈
我关注scala有一段时间了 过一阶段发个 测试的demo看看 也很不错 毕竟写出的东西没有好的测试去辅佐 谁放心呢?scala不差! |
|
返回顶楼 | |
发表时间:2008-01-25
neusun 写道 对 Jruby性能问题似乎遇到了瓶颈
正如我前面说的,JRuby首要关注的是兼容性,不过JRuby团队也在不断改善JRuby的性能。1月8号发布了JRuby 1.1RC1,介绍里有这么一段话: 引用 JRuby 1.1RC1 is the first release candidate of JRuby 1.1. JRuby 1.1 represents a concerted focus on speed and refinement. Ruby code can completely compile in an Ahead Of Time (AOT) or Just In Time (JIT) mode; yielding a faster Ruby! It also uses less memory than our previous releases.
此外,JRuby可以把rb编译为class,官方站点中有篇关于JRuby Compiler的wiki,其中有一节是性能对比,内容如下:(估计用的还是JRuby 0.9.9) 引用 A few microbenchmarks comparing Ruby, JRuby interpreted, and JRuby compiled (server VM numbers show worst and best numbers):
fib(30) Ruby: 1.67s fib(30) JRuby interp (client VM): 3.93s fib(30) JRuby interp (server VM): 2.28s to 2.08s fib(30) JRuby compiled (client VM): 1.89s to 1.79s fib(30) JRuby compiled (server VM): 1.66s to 0.86s |
|
返回顶楼 | |
发表时间:2008-01-25
现在java的最主要的创新是JVM而非java语法本身,让各种编程语言跑在同一个平台(JVM)里面是一件非常美妙的事情.
|
|
返回顶楼 | |
发表时间:2008-01-26
好,谢谢您,写得不错啊
|
|
返回顶楼 | |
发表时间:2008-01-26
鸡肋,新瓶装旧酒,就像PHP也可以引用JAVA一样。
|
|
返回顶楼 | |
发表时间:2008-01-27
hibernate vs ejb,jdo
jruby vs groovy
本来没什么标准的,用的人多了就是事实标准
有的软件是根据需要进化而来,而有的是认为捏造的。。
|
|
返回顶楼 | |
发表时间:2008-01-27
兼容带来的后果就是一团糟,发展路线不会很清晰,Jmess.
还是早日有个了断吧。 |
|
返回顶楼 | |