Grails 2.0發布,增強了易用性、類加載和查詢DSL
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。在推ter等站點上,人們也越來越多的提到它,這顯然表明有更多的人在討論它。
我注意到一件有趣的事情:具有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
來自: Info