讀古今文學網 > Java程序員修煉之道 > 12.2 Maven 3入門項目 >

12.2 Maven 3入門項目

Maven遵循慣例優先的原則,你只要創建一個快速啟動項目,馬上就能看到它慣用的項目結構。它喜歡的典型項目結構看起來和下面的佈局類似。

依照慣例,Maven把代碼分成了main和test兩部分。它還創建了一個特別的resources目錄,構建工作所需的其他任何文件(比如用於日誌的log4.xml文件、Hibernate配置文件以及其他類似資源文件)都放在這個目錄下。pom.xml是Maven的構建腳本,關於這個文件的詳情,請參見附錄E。

如果你是多語言程序員,Scala和Groovy源碼跟Java源碼的結構一樣,只是Java源碼放在java目錄下,而它們的根目錄分別是scala和groovy。Java、Scala和Groovy代碼可以高高興興地手拉手出現在同一個Maven項目中。

target目錄是構建運行後才會創建的。所有的類、工件、報告和構建產生的其他文件都會出現在這個目錄下。對於Maven項目結構的完整列表,請參見Maven網站上的Introduction to the Standard Directory Layout(標準目錄佈局介紹)頁面(http://t.cn/aKJYxo)。

要為新項目創建這個結構,請執行下面的目標(注意其中的參數):

mvn archetype:generate
    -DgroupId=com.mycompany.app
    -DartifactId=my-app
    -DarchetypeArtifactId=maven-archetype-quickstart
    -DinteractiveMode=false
  

然後你會看到Maven開始刷屏,它在瘋狂下載插件和第三方類庫。Maven需要它們來運行這個目標,它的默認下載地址是Maven Central(工件的在線資源庫)。

為什麼Maven看起來像要把整個互聯網都下載下來?

「哦,又來了,Maven又開始下載了。」這是構建Java項目的兄弟之間常說的模因1 。但這真是Maven的錯嗎?我們認為它這樣做有兩個根本原因。一是第三方類庫開發人員對包和依賴的管理很爛(比如在他們的pom.xml文件裡指定一個實際上並不需要的依賴項)。另一個是繼承自JAR為主的包系統自身的缺陷,沒辦法做更細化的依賴項控制。

1 模因(Meme)也稱為米姆、彌、彌因、彌母、迷因以及謎米等,是文化資訊傳承單位。這個詞是1976年理查德‧道金斯在《自私的基因》一書中創造的,以生物學中的演化規則類比文化傳承的過程。模因包含甚廣,包括宗教、謠言、新聞、知識、觀念、習慣、習俗,甚至口號、諺語、用語、用字、笑話。——譯者注

除了「正在下載......」,控制台應該還會有下面這種聲明:

[INFO] ----------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------------
[INFO] Total time: 1.703s
[INFO] Finished at: Fri Jun 24 13:51:58 BST 2011
[INFO] Final Memory: 6M/16M
[INFO] ----------------------------------------------------------------
  

如果這一步失敗了,很可能是你的代理服務器不允許訪問Maven Central,插件和第三方類庫都放在那上面。要解決這個問題,只要編輯settings.xml文件(見附錄A的A.2節),把下面這部分內容加上去,請根據你的實際情況為各元素填上恰當的值:

<proxies>
   <proxy>
      <active>true</active>
      <protocol></protocol>
      <username></username>
      <password></password>
      <host></host>
      <port></port>
   </proxy>
</proxies>
  

重新運行上面的目標,這次應該能看到my-app項目出現在了目錄中。

提示 如果團隊中的所有人都遇到了這個問題,請在$M2_HOME/conf/settings.xml中加上代理配置。

Maven支持的原型(項目佈局)幾乎是無限的。如果要生成某個特定類型的項目(比如JEE6的項目),可以執行mvn archetype:generate目標,然後只要遵照它給你的提示就行了。

為了探索Maven的更多細節,我們來看一個源碼和測試代碼都已經準備好的項目,用它把整個構建週期走一遍。