2011年12月10日

使用 Gradle 快速建立 Tomcat 開發測試環境

使用 Gradle 可以方常方便以 Tomcat 建立 Java EE 的開發測試環境,所需要的步驟就是建立一個符合 Gradle convention(慣例)的資料夾、檔案結構。
  • /project1
  • /project1/build.gradle
  • /project1/src/main/webapp/hello.jsp

過去被放置在 WebContents 如 WEB-INF、*.jsp 等,都搬到 src/main/webapp 即可。

這裡的 hello.jsp 只需要一行「hello」文字,即可用於測試。

其中最重要的設定檔,就是 build.gradle,它類似 Apache Ant 的設定檔 build.xml,但是以 Groovy 語言撰寫,設定更簡單、功能更強大。

一個最基本的 Gradle(build.gradle)設定範例如下:

JSP只要正確放在 webapp 即可,不需要其它設定。以此例而言,即使沒有 WEB-INF/web.xml 仍然可以執行、測試。

打開終端機輸入指令,啟動 Tomcat 的指令為:

gradle tomcatRun

執行成功後,會看到「:tomcatRun」的訊息,用瀏覽器打開以下網址,就可以測試結果(顯示 hello 文字)。

http://localhost:8080/tomcat/hello.jsp

回到終端機畫面,以「Ctrl+C」停止 Tomcat。

下一步,我們加入 HelloServlet.java。


以及 web.xml 的設定。


包含 Servlet、Filter、Listener 等等,以 Java 撰寫的 Class 原始碼,都放在 src/main/java 底下。
  • /project1/src/main/java/test/HelloServlet.java
  • /project1/src/main/webapp/WEB-INF/web.xml

在執行一次 Tomcat 伺服器:

gradle tomcatRunWar

執行這個指令,會自動進行 compileJava(以 javac 編譯 *.java 程式碼)的任務。

將 tomcatRun 改為 tomcatRunWar 的原因,主要是 tomcatRun 不會將編譯好的 class 放到 WEB-INF/classes,造成 Servlet 的 class 找不到。

用瀏覽器再測試一次結果:

http://localhost:8080/tomcat/hello


如果你的專案需要加入其它函式庫套件(*.jar),例如 MySQL Connector/J,只需要在 dependencies 加入一行宣告。

dependencies {
        compile 'net.sourceforge.nekohtml:nekohtml:1.9.15'
        runtime 'mysql:mysql-connector-java:5.1.18'
        ...


compile 或 runtime 指明套件的依賴是在編譯階段,或執行期才需要。以 JDBC 存取 MySQL 來說,我們在 Servlet 的 import 通常會以 JDBC 的類別為主,不會直接使用 MySQL Connector/J 提供的類別,所以就可以用 runtime 宣告。而專案的 Java 程式碼有直接 import 的相關類別,就必須用 compile 宣告,才能通過 compileJava 的編譯。

由於 Gradle 會從 Maven 的 repository 尋找相依的套件,可以到 Maven Repository 網站搜尋套件。

以 MySQL 為例,找到 mysql-connector-java 5.1.8 這個版本,就可以從網頁取得 Gradle 需要的宣告:


使用宣告的方式管理專案相依的套件,可以得到許多好處:
  1. 不必把 *.jar 檔案放到專案的 WEB-INF/lib 資料夾下,所以不會被送到版本控制系統。因為這些外來的函式庫本來就不屬於專案的一部分,沒必要浪費儲存空間和拖慢其它成員存取專案的時間。
  2. Gradle 會幫忙處理「相依性」的問題,節省開發者的生命時間。例如使用某個套件,它又依賴 commons-lang,手動方式處理就必須另外再去下載一份,當專案依賴的套件數量變多,WEB-INF/lib 底下的檔案就會讓人眼花撩亂,根本無法維護。
  3. 未來需要更新套件的版本,只要從 build.gradle 修改版本編號即可。

有許多 Java 的 Open Source 函式庫,都會提供一段 Maven 設定訊息:
  • groupId: org.apache.commons
  • artifactId: commons-lang3
  • version: 3.1

組合成 groupId:artifactId:version 格式,就可以交給 Gradle 處理。

雖然這篇文章說明 Tomcat,但是在實務上,舊專案從傳統的 Tomcat 使用方式,改以 Gradle 自動建置後,可以用 Jetty 取代 Tomcat 作為開發期間的測試伺服器。

Jetty 具有精簡、輕巧、速度快的優點,而且 Gradle 內建 Jetty Plugin,使用上非常方便。

在一般企業環境,可能還是選擇 Tomcat 或其它 Java EE Container 做為正式的伺服器方案。所以,專案改用 Gradle 建置後,可以同時啟用 Tomcat 及 Jetty 兩個 Plugin,讓開發階段用更輕巧的 Jetty 進行測試,等到完成一個段落,要正式佈署前,在用 Tomcat 測試一次。

一般來說,我們可以搭配 Gradle 的 War Plugin 使用,在專案經過 Jetty 及 Tomcat 測試沒問題後,就可以打包成 .war 檔,以方便佈署到(一或多部)伺服器。

舊專案只需要花少許的時間,將 build.gradle 設定檔完成,日後在開發時,就可以用簡單的 Gradle 指令進行專案自動化作業,例如:

# 自動化測試(搭配 JUnit、Spock 等)
gradle test

# 自動檢查程式碼品質(搭配 CheckStyle 及 CodeNarc)
gradle check

# 執行 Jetty 網頁伺服器
gradle jettyRun

# 執行 Tomcat 網頁伺服器
gradle tomcatRunWar

# 打包成 WAR 檔
gradle war

# 可以自訂一個自動發佈到遠端伺服器的任務
gradle deployToServer

以上適合舊專案,或是簡單的小型拋棄式專案,改用 Gradle 將許多開發階段的瑣事自動化。至於新的 Java EE 專案,則可以選擇 GrailsPlay! 幫助開發人員節約生命時間。

1 則留言:

lyhcode by lyhcode
歡迎轉載,請務必註明出處!