Grails 2.0 发布,增强了易用性、类加载和查询 DSL

  • Rick Hightower
  • 胡键

2011 年 12 月 24 日

话题:Java语言 & 开发

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 为中心。

新特性包括:

  1. 控制台具有 tab 键自动代码补全的功能,而且对输出进行了着色。
  2. 更可靠的类加载机制,这让 Grails 在刷新页面和做事方式上有几分 PHP 的感觉;
  3. 更好的调试支持:增强的错误报告和更准确的问题诊断;
  4. 库更新至Groovy 1.8Spring 3.1Hibernate 3.6和 Servlet 3.0;
  5. 提供了帮助 Grails 插件开发的静态资源(CSS、Javascript 等)交付框架,如此一来,多个 Grails 插件包含的相同 JavaScript 在同一页面只会加载一次。
  6. 新的链接产生和页面渲染 API
  7. GORM 新特性:detached criteria、Where 查询、多数据源,它们利用 Groovy AST 提供了可以完成手头任务的 DSL,而且还能使编译器进行类型检查
  8. 改进了单元测试,可以使用 Spock、JUnit 或 TestNG
  9. Database migration 插件
  10. 改进了数据库逆向工程;
  11. ……

观点:阅读 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 的特性。相当有可能一些用户要求的特性来自于其他框架,但我们并没有必要去了解这一点。

查看英文原文: Grails 2.0 Released with Improved Usability, Class Reloading, and Query DSL

Java语言 & 开发