Maven 初探 
颱風前後,簡單進行了將現有專案移轉到 Maven 的可行性評估。
以下是以先前開發的 SnipSnap plugin 做一個簡單的記錄:
※注意:若使用 UTF-8 作為 .xml 檔之文件編碼,則要注意將檔頭之 Unicode 標記移除!
安裝
參考
Installing Maven 將 Maven 裝起來,當然相關的環境變數就不多說了。
選定專案目錄
選定一個新的目錄,作為專案的基礎目錄,如:E:\MAVEN_PROJECT\myProject。
初始化專案樣本
在 DOS 視窗中切換到前述專案目錄下,鍵入 maven genapp 。其中 templates 可以選擇 default ( 一般 Application 或 jar 類別庫 ) 或 web ( 一般 Web Application ),如附圖:
移除不必要之檔案
Maven 的各類預設樣本皆會在目錄中留下一些足供 Maven 運作卻非專案所需的檔案,這類的檔案可以全部移除。如 src/conf/app.properties 或 src/App.java 等,其中 src/test 目錄進行 junit test 測試的預設目錄,也可以刪除之。
移入專案相關檔案
將原先已寫好的原始檔案複製到 src/java 目錄下,並且一併將 snipsnap 要求的 services/ 目錄複製到 conf/ 下。有關於是否要將 services/ 放到 conf/ 目錄下其實可以透過 project.xml 再進行設定(有些會認為要放到 resources/ 目錄下)。完整目錄結構可參考附圖:
管理類別庫
Maven 本地端資源庫
雖然說 Maven 會自動由網路上載入專案指定版本的 jar 類別庫,但也可能因為該類別庫為公司獨立開發或其他因素之故必須自行準備,此時要自行將該類別庫放入 Maven 的本地端資源庫 (Maven Local Repository) 中。
新增自有類別庫
Maven 使用 groupId、artifactId、version 作為識別一個 jar 類別庫的依據,依次代表該 jar 檔的
群組別 、
jar檔名稱 、
版本別 。若要新增非公開的類別庫時只須在 Maven 的本地資源庫所在目錄中建立 ${groupdID}/jars/${artifactId}-${version}.jar 檔即可,如附圖即為建立兩個附屬於 radeox 群組的類別庫:
原始 project.xml 檔
透過 genapp 這個 goal 會產生一個 project.xml 的基本檔,我們可以自行修改這個檔的內容。預設的檔案內容如下:
類別庫相依性設定
在 project.xml 中可以指定專案所須的類別庫及其版號,修改 <dependencies/> 如下:
調整專案建置程序
在 <build/> 區段中可以指定 Maven 在建置程序中的一些細節,此處我們不做 JUnit 測試,並且預訂讓打包後的 jar 檔包含整個 Maven 建置設定。
初步執行
透過 jar 這個 goal 可以建立一個 jar 檔,請參考以下附圖。特別注意的是其中有一段複製檔案的輸出區塊,它的 goal name 是 java:jar-resources,這個資訊等下會使用到。
額外處理
有時候會因為使用的編輯器的關係而在專案目錄中建立許多的備份檔,光靠前述的建置程序也會將這些檔案包到 jar 檔中。雖說可以透過 excludes 設定將特定的檔案排除,但個人比較喜歡事先將這些廢棄物予以刪除。
雖然 Maven 有內建一個叫做 clean 的 goal,但這個 goal 只限於清除暫存目錄而以,完全無法滿足這龜毛的要求。不過 Maven 可以在每一個 goal 的前後依需要執行一些額外的程序,其使用的語法則非常類似 ant 的 scripts。
maven.xml
透過 maven.xml 可以自行新增一個 goal,也可以在設定在某個 goal 執行前後所要另行處理的動作。由前圖中可知 Maven 是在 java:jar-resources 這個 goal 時進行檔案複製動作的,那只要在這個 goal 執行前將不想要的檔案予以刪除即可。以下是刪除 .bak 檔的 maven.xml 檔,這個檔案必須與 project.xml 放在同一個目錄中才能運作。
可發現,maven.xml 中在 <preGoal /> 內的語法與 ant 一模一樣,但是除了 ant scripts 外,其實尚可使用 jelly scripts,只是這部份有空時再研究吧!
從 jar 檔透過 Maven 重新發佈
前述的設定目的是為了讓 .jar 檔包含重新發佈時所需的相關參數,此處將先前建立的 jspbbSnipSnap-1.0.jar 解壓到 E:\MAVEN_PROJECT\test 目錄下並償試重新建立 jar 檔,如附圖。

完成建置程序後,可以發現原先的 META-INF 及 net 目錄已被移除,目標達成!同時我們也可以發現整個輸出的訊息有兩種:一種是由 [] 所前導的訊息,另一種則無。若已熟悉 ant 的操作者應該會發現其實 Maven 是以 ant 為其底層支援系統,這表示先前所撰寫的 ant scripts 將可以在 Maven 下繼續使用。