VMWare公司SpringSource部门的 Grails开发团队近日宣布了Grails 2.0的发布。本次发布借鉴Roo的控制台(console)改进了Grails的易用性。提供了作用于Java和Groovy的高级类重载 (reload)机制。Grails中的持久层,GORM通过AST转换(AST transformation)最大限度利用了来自Groovy 1.8的DSL支持。
Grails的首席开发者和缔造者,Graeme Rocher,于12月15日撰写了官方公告。
在公告中,他提到本次发布是一年工作的辉煌成果。这次发布增强了用户体验:更清晰的调试信息和一个具有代码补全功能的控制台(console)应用,后者让人容易联想到SpringSource的另一个项目:Roo,其目标跟Grails类似,但以java为中心。
新特性包括:
- 控制台具有tab键自动代码补全的功能,而且对输出进行了着色。
- 更可靠的类加载机制,这让Grails在刷新页面和做事方式上有几分PHP的感觉;
- 更好的调试支持:增强的错误报告和更准确的问题诊断;
- 库更新至Groovy 1.8、Spring 3.1、Hibernate 3.6和Servlet 3.0;
- 提供了帮助Grails插件开发的静态资源(CSS、Javascript等)交付框架,如此一来,多个Grails插件包含的相同JavaScript在同一页面只会加载一次。
- 新的链接产生和页面渲染API
- GORM新特性:detached criteria、Where查询、多数据源,它们利用Groovy AST提供了可以完成手头任务的DSL,而且还能使编译器进行类型检查
- 改进了单元测试,可以使用Spock、JUnit或TestNG
- Database migration插件
- 改进了数据库逆向工程;
- ……
观点:阅读GORM的detached查询DSL和where方法查询DSL后,几乎完全打消了对于“Groovy AST转换(AST Transformation)是否有助于Groovy DSL开发”的疑问。随着Groovy 1.8的发布,Groovy已成为一流的对DSL提供良好支持的语言。GORM凸显了Groovy优秀的DSL支持。
InfoQ借此机会采访了Grails的布道者Peter Ledbrook。Peter自其在G2one(被SpringSource收购前支持Grails/Groovy开发的公司)工作起就是一名令人尊敬的 布道者。Peter于2006年开始从事Grails方面的工作,当时它还被称作Groovy on Rails。
InfoQ:最新版本中有哪些重大变化?
可以看到的最直接变化是一个新的交互式控制台(console),这里有一个简短的演示视频。 简单讲,它具有tab键自动代码补全、历史缓存、语法加亮等功能,由于是一个运行的JVM,所有命令的执行都相当快,因为无需为每条命令都装入Java和 初始化Groovy。另一个好处是我们的类加载机制,它由JVM代理(agent)完成。我们总有东西要重新加载,但现在它工作更可靠,而且带来了更多好 处。它现在作用于领域类(Domain Class)。重启Servlet容器对于用户来讲将变得不再频繁。
他还谈到了测试框架的改进和简化Grails插件开发的静态资源交付。新增的单元测试的灵活性可以更容易的使用JUnit、Spock、 TestNG等框架。单元测试具有GORM模拟功能,不用触及数据库就可以测试数据库存取。Roo和Grails的控制台(console)支持和类加载 支持都受益于JVM重载代理(JVM reloading agent),它是Spring Source工具套件的一部分。
InfoQ:对于CloudFoundry、Amazon EC2和Google App Engine(GAE),Grails提供了对哪个的支持?它是否内置了对EC2的支持?
Grails核心并不支持云,但通过各种插件可以很容易添加对它的支持。如CloudFoundry,我们提供了一流的支持。虽 然有部署用的VMC工具,但我们有个插件几乎可以完成它的所有功能,而且它还能知道Grails复制(replication)。它知道你是否安装了 MongoDB Grails插件,假若有,它会在部署时检查到你需要使用CloudFoundry提供的MongoDB服务并将其与应用绑定。实际上,它会问你是否供应 (provision)并绑定一个MongoDB的实例。这非常有用,应用根本不必关注CloudFoundry。
他继续谈到了Amazon WS(EC2、S3等)插件,用它可方便地访问诸如消息传递、存储等Amazon服务。它并不提供将应用部署到Amazon的功能。他又谈到了使用 Groovy配置文件访问配置在Amazon BeanStalk中的属性的几种方法,这样可方便使用BeanStalk完成到Amazon的快速部署。
接下来,他谈到了对Google App Engine的支持。有一个GAE Grails插件,用它可把应用部署到GAE。但要让GORM支持Google风格的JPA,还有些工作要做。向平台进行部署,也有些工作要完成。
他略微提到在GORM对JPA的支持上还有一项工作要做。当前的GORM JPA适配器支持JPA 1.0,它需要更新到JPA 2.0。通过支持JPA 2.0,GORM可实际支持更多构建在JPA 2.0上的持久化解决方案。
InfoQ:GORM的主要变化是什么?GORM是一个独立项目吗?我可以把GORM用于非Grails工程吗?
GORM有很多增强。其中最引人注目的就是可以将GORM用于另一类数据存储——NoSQL数据存储。我们发布了MongoDB和Redis插件的最新版,随后还会支持其他数据库。人们可以用一种标准API访问这类数据存储。
我们还引入了一种新的查询语法,我期望它能取代动态查找器(dynamic finder)和Criteria API。我们称之为where查询,使用的是where方法。这真是Java和Groovy开发者的福音,因为你可以使用标准的符号。你可以使用Groovy/Java的等于和大于等于操作符,跟在编码中使用逻辑操作符(&&、||等)时没太大区别。
where方法看上去有点像SQL/Java/Groovy的自定义DSL,InfoQ有意刁难了一下Peter,详细了解它的实现机制。概括说来,where方 法语法用到了Groovy AST转换(AST transformation)。这样,你不仅拥有了一种DSL查询语言,而且还可以让编译器能够用一种非常自然的方式对其进行类型检查和更多编译检查。 它不仅仅是一个字符串。借助于AST转换(AST Transformation),它成了语言的一部分。这种将转换(transformation)应用到where上的方式,非常像Spock测试框架。这很酷,就像一种魔法。Peter提到,有些非常有趣的内容,它们可以用Groovy AST转换(AST transformation)实现。
Grails 2.0包含的GORM提供了对Redis、Riak和MongoDB等NoSQL的支持,社区还贡献了对Neo4j的支持。
InfoQ:GORM是一个独立项目吗?
是,也不是。现在,它的大部分都在一系列Grails数据映射项目中实现了,这些项目基本上建立在Spring Data项目基础上的。你可以直接使用它们。你可脱离Grails应用环境使用GORM for MongoDB。
GORM for Hibernate可能要做更多工作,Grails自身包含了一些GORM代码。当人们说到在Grails外使用GORM时,他们指的是GORM for Hibernate。我们需要在此做一些工作。大部分GORM新特性都在独立项目中。
InfoQ:如何从老应用升级到Grails 2.0?
有些项目直接运行grails upgrade命令就够了。一些破坏性的变更已经记录在文档中,但程序改动都很简单。你可能要增加一个配置设置,增加一个模板(template)。要是想使用Grails 2.0的单元测试框架,你需要完全转换到新测试。这个工作量不小。
更重要的是在Grails内核之外,我们做了不错的工作确保关键插件都更新到了最新版。现在已经有了很多插件,其中一些可能仍然需要更新。我们将尽力配合Grails插件作者完成必要的兼容Grails 2.0的工作。
InfoQ:Grails的使用情况如何?有没有增长?你觉得它的使用人数有没有变多?
当然有。邮件列表的流量越来越多。有更多传闻和迹象表明人们在使用Grails。在Twitter等站点上,人们也越来越多的提到它,这显然表明有更多的人在讨论它。
我注意到一件有趣的事情:具有PHP背景的人在转向Grails。这件事改变了我们的观点。Grails不仅仅是面向Java开发者的,而且它让Java平台对那些没有Java背景的人显得平易近人。
访问Indeed.com,可以看到有大量的工作需要Grails开发者。过去两年,增长速度可能有10倍。
InfoQ:对于类似的项目,如Roo、Rails和Play framework,你的看法是什么?最近有没有相互借鉴想法?你是否看到有类似的功能?对关联框架有何评论?
相互借鉴已经有一段时日了。而且,Rails显然一如既往地总是对Grails有强劲的影响。我不太清楚最近有没有。例如,我们的静态资源支持是独 立于Rails中类似特性完成的。但当它完工时,我们才意识到Rails已经实现了相似功能。这非常有趣,有人可能会认为我们借鉴了这个想法。
然而,我们并不排斥借鉴好的想法。毫无疑问,Spring Roo的交互式控制台(console)对我们影响很大,而且展现了它的优势,尤其是处理基于Java的系统时。我们会保持对其他框架的关注。很难讲什么 是主动借鉴和什么是仅仅意识到有事情发生了,就像完成对REST支持的一样。这没有明显的区别。很多新东西其实是Grails与生俱来的,尤其是围绕 GORM的特性。相当有可能一些用户要求的特性来自于其他框架,但我们并没有必要去了解这一点。