Grails 和 Maven:一種不方便的結合

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

介紹

Grails 似乎發展勢頭越來越好,並且看起來確實“有潛力”,正如他們所說。我很有興趣將這些潛力擴充套件到 Web 應用程式領域之外。如果您瞭解我在Spring Batch 上的工作,您大概可以猜出這會把我帶到哪裡。但在這篇文章中,我想分享一些我在 Grails 應用程式的基本、低階部署和構建方面的一些經驗。

我對 Maven 2 既愛又恨,我正在學習喜歡 Grails,但遺憾的是這兩者配合得並不特別好。如果能有更緊密的整合就好了。Maven 並不總是我們想要的樣子,但有些東西確實讓它物有所值。它是一種某種程度的標準(愛它或恨它),所以當我從某個地方下載一個專案時,我已經知道如何構建它,它的依賴是什麼,以及文件在哪裡。Grails 也有一些相同的特性,事實上,它自己基於 Groovy 指令碼的 Ant 就包含了一個相當複雜的構建工具。也許 there is a middle way, where we can have the best of both worlds?

我也意識到這個領域的一些其他活動,我希望我們能圍繞著什麼東西團結起來(也許由這個論壇和 Grails JIRA 中的討論驅動)。例如,請看 Frederick Verbist 的 部落格 和 Arnaud Heritier 的 maven 整合專案(目前才剛剛起步)。Grails 團隊對 Maven 一向不以為然(例如,請看 這裡),但我與 Graeme Rocher 聊過,他願意接受建議,所以我希望我們能在此取得一些進展。

為 Grails 原型開發使用 Maven 進行依賴管理

本著朝著 Maven 整合邁出簡單步驟的精神,我附加了一組 poms,它們(大致)描述了我所瞭解的 Grails 0.5.6 的依賴結構。如果您在使用 Spring 版本時遇到問題,可以忽略或更改 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...

這是第一個面對 Grails 專案並試圖理解它是如何組合在一起的陷入瘋狂的 Maven 使用者發出的呼喊。希望我們在這裡將展示如何安撫這位可憐的發狂的個人。為此,我們將介紹一些簡單的步驟來為現有的 Grails 專案建立一個 Maven 專案。

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

  • base = 與 Web 應用程式無關的依賴項的基礎 POM。我已經相當寬鬆了(例如,包括 Spring Weblfow)。目標是僅憑這些依賴項就可以啟動 grails console。
  • web = 建立 Web 應用程式 WAR 檔案所需的其他依賴項。這在一定程度上可能取決於平臺,但此處包含的依賴項可以在 Servlet 2.4 容器(如 Jetty 5.1,Grails 傳統上使用它)中工作。
  • launch = Jetty 和 JSP 依賴項,僅用於在獨立或開發環境中啟動 Web 應用程式

要安裝 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 的一些依賴項可能與 POM 中的依賴項(Grails POM 或專案 POM)不同或名稱不同。當您執行“grails package”時,它會將 GRAILS_HOME/lib 中的 jar 複製到 web-app/WEB-INF/lib 中,並且無法阻止重複。例如, wherever Grails does not use the fully-qualified jar name, you will see duplicates in WEB-INF/lib。

Maven 依賴外掛不允許我們排除提供的依賴項(至少目前是這樣),這使得問題更加複雜,所以當你執行“mvn package”時,所有的 Grails 依賴項都會進入 ./lib。這對 Grails 開發人員來說是不方便的,因為它們通常是從 GRAILS_HOME/lib 複製的。理想情況下,在我們可以稱之為真正的 Maven-Grails 整合之前,這種衝突將得到解決。

缺少其他 Maven 生命週期階段

簡單的演示為 Grails 提供了 clean 和 package 生命週期增強。我們希望能夠使用 Maven 為我們完成更多的開發和持續整合工作。

例如,我們希望從 Grails 專案佈局構建 WAR 檔案。使用 Ant 和 Maven 實現這一點並不難。理想情況下,它應該實現為一個 Maven 外掛 - 這基本上是 Arnaud 的專案,所以我希望他能取得一些進展,但也希望他能從這裡的經驗中學習。

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

Grails 打包週期

Grails 和 Maven 各自擁有自己的“package”週期。通常 Grails 的週期只需要發生一次(在 clean 之間),但仍然很麻煩,需要記住去執行它。

Eclipse 的 Groovy 外掛

在 .groovy 原始檔中進行語法高亮顯示很好,但除此之外,Groovy 外掛似乎會礙事。這實際上與 Maven 或 Grails 都無關,但眾所周知,它會導致其他 Grails Eclipse 使用者出現問題。例如,如果您編輯控制器或服務,您可能會看到一個警告訊息,詢問您是否要終止應用程式。Groovy 外掛檢測到更改,Eclipse 無法處理類路徑的更改。但 Grails 可以,所以通常您可以點選“Continue”按鈕。但並非總是可以。在專案屬性中停用 Groovy 編譯是安全的,但這樣您就會失去非 grails-app 類的動態編譯。
再次附上附件:點選 這裡

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有