jRuby on Rails与Grails比较

10
我想开发一个全新的web应用程序,将重复使用大量Java组件。对我来说,显而易见的选择是Grails或jRuby on Rails,但我很难找到两者之间客观比较的资料。是否有任何明显的理由在以下方面选择其中之一:
  1. 易于与现有Java组件(在持久域之外)集成,例如JMS、EIP
  2. 支持功能测试框架
  3. 单机性能
  4. 可扩展性
寻求与开发人员的可用性或社区活动相关的答案。
(我查看了 Grails vs. Rails,但这与我无关)

除了上面的答案之外,Grails还有一个JMS插件。 - Jörg Brenninkmeyer
我认为答案可能在检查每个 Gem 或插件中有哪些可以帮助进行集成。 - Scott Warren
6个回答

20

尝试两者,选择最适合您的语言和环境。事实是,Grails堆栈默认更适合于Java集成,但许多组件距离与Rails集成仅有几行Ruby代码。Rails 3是一个很棒的版本,不需要您使用ActiveRecord,实际上,使用Hibernate代替模型将变得微不足道。此外,还可以查看DataMapper、MongoMapper和大量数据库适配器,适用于各种SQL和NoSQL数据库。

同时,JUnit!=功能测试。相反,请查看Cucumber + Cucumber-Rails + Capybara + Selenium,以获得集成浏览器自动化测试体验。请参阅https://github.com/elabs/front_end_testing,获取演示此堆栈的示例应用程序。

我建议Ruby更适合作为Web集成语言,而JRuby则恰到好处地使集成Java易于使用且舒适,同时为您提供了非Java库的丰富资源。不要认为Groovy自动赢得了优势,因为它与Java“更接近”。有时候,您需要进入一个耳目一新的不同环境,以重新审视如何解决问题。

声明:作为JRuby团队的成员,我的偏见在我的答案中明显。


4
哇,到目前为止有15个点赞?为什么呢?-提问者指定了四个标准来判断答案是否为解决方案。-然而,你只回应了其中一个(功能测试)。-那集成Java企业技术比如JMS怎么办(这在问题中是一个要求)?很可能JRUBY与其之间相差甚远。 - robbbert
谢谢你(可以理解地有点偏见 ;))的回应。就像@robbbert所说的那样,这并没有解决提出的所有问题。此外,我知道JUnit不是太适合进行功能测试;也许这应该成为@ammoQ答案的一个注释? - Armand
1
@robbert +1。可伸缩性和性能怎么样?http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/ 此外,Grails 不仅在语法上更接近 Java,而且在集成方面也十分容易。它的 Spring 支持架构非常出色且使用起来非常简单。 - Wanderson Santos

5
我很熟悉Grails(目前正在开发一个Grails项目),但不熟悉JRuby,所以这只是一种可能有偏见的观点:从JRuby文档来看,JRuby与Java的集成有些麻烦,因为在Groovy中Java比在Ruby中更本地化。因此,在JRuby中,您有许多特定于Java的关键字和方法(例如java_importjava_send)。简而言之,Groovy是专门针对Java世界的语言,而JRuby则是将Ruby放在JVM上。
Grails内置了JUnit测试。
无法说太多关于性能和可扩展性,但考虑到与Java的良好集成,当Groovy速度过慢时,可以始终使用Java编写性能关键部分。

谢谢,你已经解决了第一个问题。你在这个集成方面有很多经验吗?比较代码片段可能会有用。至于JUnit,我认为它更适合单元测试而不是功能测试;如果我错了,请纠正我。如果我理解正确,无论是使用Groovy还是JRuby,出于性能原因重写Java代码都是一种选择。同样地,请纠正我如果我错了。 - Armand
Alison: Groovy能够与Java无缝集成,调用Java对象的方法所需的Groovy代码片段看起来就像是Groovy调用Groovy或Java调用Java一样。至于功能测试:你说得对,不过这个链接可以帮到你:http://www.grails.org/Functional+Testing - Erich Kitzmueller
在JRuby中重写Java也是一种选择,但Groovy的语法(与Java相对较接近)和无缝集成可能使在Grails中更容易些。 - Erich Kitzmueller

4
  1. 正如phoet所说,Grails具有一流的Spring支持,因此通常非常容易集成Spring库——这就是许多插件所做的工作,包括JMS插件。
    Java代码可以提供在JAR文件中或放在项目的src/java目录中。Groovy类可以引用Java类,Java类可以引用Groovy类。它非常无缝。
  2. Grails通过各种插件支持HtmlUnit、Selenium-rc和WebDriver。Geb目前受到很多关注,特别是与Spock结合使用时。
  3. 进行测试。我不知道是否有最近的比较,但性能通常严重依赖于您的应用程序。http://grails.org/http://beta.grails.org/ 都在单台机器上运行,并且都是Grails应用程序。
  4. 我了解到通过Terracotta对Grails进行群集化相当容易。如果需要,您还可以使用普通Tomcat进行群集化。有分布式缓存的选项——SpringSource也有自己的(商业)产品,名为GemFire。

希望这能帮到你,鉴于完全透明化的利益,我是Grails团队的成员。


4
  • 与现有Java组件集成的易用性:

使用Groovy更容易,因为Groovy基本上就是Java。您不需要进行大量的上下文切换。

  • 支持功能测试框架

Ruby有自己的一堆测试框架,如rspec/shoulda/cucumber/steak等等。由于我喜欢Ruby语法,所以我更喜欢这些框架。

  • 单机性能

据我所知,Grails在多线程方面更好,因为Rails过去没有太关注这个问题。他们目前正在赶上,所以可能会打平。

  • 可扩展性

两者都可以扩展到JVM环境。如果您已经有了Java的运行基础设施,则更容易集成Grails。


1
感谢回答。1. Groovy与JRuby集成是否更容易? 2. 很高兴听到Ruby有测试选项;这些选项是否都与JRuby兼容?3. 我了解到JRuby的线程模型与标准Ruby的线程模型显著不同(例如,它实际上使用线程);你考虑过这一点吗?4. 扩展JRuby可能就像扩展Rails应用程序一样简单 - 只需使用Java应用程序服务器而不是Ruby应用程序服务器。有什么想法? - Armand
  1. 这不是关于Groovy与JRuby的集成,而是关于Grails与JRuby On Rails的集成。Grails更容易,因为它只是另一个Java库。JROR使用诸如warbler或自定义堆栈(如TorqueBox)之类的工具。
  2. 这要看情况。
  3. 就像1中所述,这涉及Rails的线程支持。Rails 3默认具有请求锁定。
  4. 不,参见3。
- phoet

3
最终,你将会根据个人选择、对两种语言的熟悉程度以及资源的可用性做出决定,但是最终我得出的结论是Grails基于Spring,所以它是我正确的选择。我知道如果一切都失败了,我可以回到使用经过验证的Spring Framework。

谢谢。我有点希望能够做出客观的决定,但你可能是对的。 - Armand

1

对于2012年对此问题感兴趣的新手...

"使用@CompileStatic,Groovy的性能比Java慢1-2倍,而没有Groovy,则慢3-5倍。(...)这对我来说意味着Groovy已经准备好用于需要与Java性能相当的应用程序."

性能测试:Groovy 2.0 vs. Java http://java.dzone.com/articles/groovy-20-performance-compared

除了作者之外,我自2008年以来一直成功地使用Groovy,不仅用于简历,而且为了按时完成业务需求。性能始终是相对于您想要做什么而言。

关于集成,Grails确实“非常好”。我从未需要进一步采取措施将其与现有库集成。相反,基于Spring的Grails性质使工作更加容易。

对于那些可能会抱怨微基准测试和真实用例的人,这里有一个有关Web框架(Grails 1.3.7)的旧一点但不错的例子(Grails 1.8):http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/

希望这可以帮到你!

附注:我想看到最近使用JRuby和其他真正动态的JVM语言的基准测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接