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的更多細節,我們來看一個源碼和測試代碼都已經準備好的項目,用它把整個構建週期走一遍。