Grails 與 Maven:不甚方便的結合

工程 | Dave Syer | 2007 年 7 月 14 日 | ...

簡介

Grails 看來正不斷壯大,而且似乎確實「有發展潛力」。我對於將其觸角稍微延伸到 Web 應用程式領域之外非常感興趣。如果您了解我關於 Spring Batch 的工作,您大概可以猜到我會如何發展。但對於本文,我只想分享一些我在 Grails 應用程式的基礎、低階部署和建置方面的一些經驗。

我對 Maven 2 有著愛恨交織的關係,而且我正學習喜愛 Grails,但遺憾的是,這兩者之間的配合並不好。如果能看到更緊密的整合,那就太好了。Maven 並非總是我們想要的,但有些東西確實讓它值得使用。它是一種標準(無論您喜歡與否),因此當我從某處下載專案時,我已經知道如何建置它、它的相依性是什麼,以及文件在哪裡。Grails 具有一些相同的功能,實際上還包含它自己相當精密的建置工具,該工具基於 Ant 的 Groovy 腳本。也許有一種中間方式,我們可以兩全其美?

我也了解此領域中的其他一些活動,我希望我們可以圍繞某些事物(可能由這個論壇和 Grails JIRA 中的討論驅動)凝聚在一起。例如,請參閱 Frederick Verbist 的 部落格 和 Arnaud Heritier 的 Maven 整合專案(目前幾乎還沒開始)。Grails 團隊傳統上對 Maven 不感興趣(例如,請參閱 此處),但我與 Graeme Rocher 進行了交談,他願意接受建議,因此我希望我們能夠在這裡取得一些進展。

使用 Maven 進行 Grails 的原型相依性管理

本著朝 Maven 整合邁出一些簡單步驟的精神,我附上了一組 poms,這些 poms(大致)描述了我所知道的 Grails 0.5.6 中 Grails 的相依性結構。如果您遇到問題,請忽略或變更 Spring 版本號碼 - Grails 0.5.6 使用 Spring 2.0,但我需要 2.1 才能用於我正在處理的專案。Graham 說 Grails 可能無法與較新版本的 Spring 正常工作,因此您的結果可能會有所不同。這就是 Maven 的美妙之處,對吧?您可以明確地、遞移地看到專案相依性,並且可以調整它們,以您控制的方式來滿足您自己的需求和風險偏好。

給 Maven 使用者的旁注:相依性外掛程式的工作效率比以前好多了,而且您可以使用 "mvn dependency:tree" 來取得相依性樹狀結構的列印輸出。這僅適用於全新的外掛程式,因此請確保 apache-snapshots 儲存庫位於您的外掛程式儲存庫中


<pluginRepositories>
	<pluginRepository>
		<id>apache-snapshots</id>
		<url>http://people.apache.org/maven-snapshot-repository</url>
	</pluginRepository>
</pluginRepositories>

比必須建置整個網站並在相依性報告中查找要方便得多,這是我過去經常做的事情。

一個 POM,一個 POM,我的王國換一個 POM...

這是一位精神錯亂的 Maven 使用者在第一次面對 Grails 專案並試圖了解它如何組合在一起時的呼喊。希望我們將在此處展示如何安撫這位可憐的精神錯亂者。為此,我們將介紹一些簡單的步驟來為現有的 Grails 專案建立 Maven 專案。

在隨附的沙箱封存檔中,有三個 poms,每個 poms 都在自己的專案中

  • base = 與 Web 應用程式無關的相依性的基本 POM。我對此相當寬容(例如,包含 Spring Weblfow)。目標是您應該能夠僅使用這些相依性啟動 grails 主控台。
  • web = 建立 Web 應用程式的 WAR 檔案所需的其他相依性。在某種程度上,這可能與平台相關,但此處包含的相依性將在 Servlet 2.4 容器(如 Jetty 5.1)(Grails 傳統上使用的容器)中工作。
  • launch = 僅用於在獨立或開發環境中啟動 Web 應用程式的 Jetty 和 JSP 相依性

若要安裝 Grails poms,您應該不需要手動將任何成品新增至您的本機儲存庫。還有一些「奇怪的東西」(在任何我能找到的標準公用儲存庫中都無法使用),我已將其包含在 "spring-ext" 儲存庫(在 pom 中定義)中。如果您已連線到網際網路,它應該可以立即運作。

執行範例的先決條件

您將需要 Maven (2.0.*) 和 Grails (0.5.6) 才能執行範例應用程式。我使用的是 Maven 2.0.7。"grails" 和 "mvn" 啟動腳本需要位於您的路徑中,而且您需要定義 GRAIL_HOME 環境變數才能執行 Grails(標準安裝程序)。

測試專案

還有一個測試專案使用上述 poms 來管理 Web 應用程式。我已決定堅持使用 Grails 目錄配置。Graham 告訴我,web-app/WEB-INF 中幾乎所有「可變」內容都將在 Grails 1.0 中移除,因此我認為使用 Grails 規定的結構是最好的方法(最不容易損壞,更容易被其他 Grails 開發人員理解)。

從 Grails 命令列啟動

$ cd test
$ mvn package
$ grails run-app

若要將其他相依性新增至測試專案,只需將它們新增至 pom 並重複執行此操作(或在 Eclipse 中不執行任何操作,請參閱下文)。Maven 是不是很棒?

請注意,Grails 相依性在專案 pom 中具有 scope=provided。這應該表示它們位於 Maven 和 Eclipse 的類別路徑中,但不會包含在任何 Maven 套件中(如果已實作)。

僅限 Eclipse 使用者

測試專案還包含 Eclipse 專案成品 - 使用 Maven Eclipse 擴充功能可獲得最佳結果 (http://m2eclipse.codehaus.org/update-dev/)。使用此 Eclipse 擴充功能,您將能夠處理工作區中作為 Maven 成品的其他專案,而且如果它們是 Grails 專案的相依性,它們將自動新增至類別路徑,並且在您進行變更時動態更新。

如果您不使用 Maven Eclipse 擴充功能,則可能可以使用 Eclipse Maven 外掛程式(也稱為 maven-eclipse-plugin)。使用 "mvn eclipse:eclipse" 來更新 .classpath 並重新整理,然後您應該可以正常運作,但無法與其他 Eclipse 專案中的變更自動同步。

您將需要先從命令列執行 "grails package"(僅一次)

$ cd test
$ grails package

這會為您產生 web.xml,並從 grails-app/conf 複製和篩選一些屬性檔案。顯然,長期的可能性是 web.xml 將是 web-app/WEB-INF 中唯一產生的檔案(因此每個人的來源控制系統中只有一個 svn:ignore)。

在 Eclipse 中,您可以匯入測試專案。然後您可以執行 Run... 並從 Java Applications 中選取 "test" 啟動器。您可以偵錯,並且可以動態變更程式碼,包括在 Grails 應用程式和相依專案中。

下一步

我附加的工具缺少一些東西/令人不舒服。它們仍在開發中。如果有人嘗試使用它們,無疑會提出如何做得更好的建議。請在這裡或在 Grails JIRA 上回覆。

以下是一些已知問題或令人煩惱的事情

使用 Grails 套件複製 Jar 檔案

來自核心的一些 Grails 相依性可能與 poms 中的相依性(Grails poms 或專案 pom)不同或只是名稱不同。當您執行 "grails package" 時,它會將 GRAILS_HOME/lib 中的 jar 檔案複製到 web-app/WEB-INF/lib 中,而且無法防止重複。例如,無論 Grails 在何處未使用完全限定的 jar 檔案名稱,您都會在 WEB-INF/lib 中看到重複的檔案。

Maven 相依性外掛程式不允許我們排除提供的相依性(目前),這使得問題更加嚴重,因此當您執行 "mvn package" 時,所有 Grails 相依性最終都會出現在 ./lib 中。這對於 Grails 開發人員來說會很不舒服,因為它們通常是從 GRAILS_HOME/lib 複製而來的。理想情況下,在我們能夠說我們真正擁有 Maven-Grails 整合之前,這種爭鬥將得到解決。

缺少其他 Maven 生命週期階段

這個簡單的示範具有 Grails 的清除和套件生命週期增強功能。我們希望能夠使用 Maven 來為我們完成更多的開發和持續整合工作。

例如,我們希望從 Grails 專案配置中建置 WAR 檔案。使用 Ant 和 Maven 來實現這一點並不難。理想情況下,它將作為 Maven 外掛程式實作 - 這幾乎是 Arnaud 的專案,所以我希望他取得一些進展,同時也希望他能從這裡的經驗中學習。

也缺少其他有用的生命週期階段。例如,測試無法從範例中的 Maven 驅動。

Grails 套件週期

Grails 和 Maven 都有各自的「套件」週期。通常,Grails 週期只需要發生一次(在清除之間),但仍然需要記住執行它,這令人煩惱。

適用於 Eclipse 的 Groovy 外掛程式

在 .groovy 來源中具有語法突顯功能很好,但除此之外,Groovy 外掛程式似乎只是礙事。這實際上與 Maven 或 Grails 無關,但已知會為其他 Grails Eclipse 使用者帶來問題。例如,如果您編輯控制器或服務,您可能會看到一條討厭的警告訊息,詢問您是否要終止應用程式。Groovy 外掛程式已偵測到變更,而 Eclipse 無法處理對類別路徑的變更。但 Grails 可以,因此通常您可以按一下「繼續」按鈕。但並非總是如此。關閉專案屬性中的 Groovy 編譯是安全的,但這樣您將會失去非 grails-app 類別的動態編譯。
再次附上附件:按一下這裡

取得 Spring 電子報

透過 Spring 電子報保持連線

訂閱

取得領先

VMware 提供訓練和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

近期活動

查看 Spring 社群所有即將舉辦的活動。

查看全部