Maven 簡介
Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。 當你使用Maven的時候,你用一個明確定義的項目對象模型來描述你的項目,然后 Maven 可以應用橫切的邏輯,這些邏輯來自一組共享的(或者自定義的)插件。
Maven 提供了構建工具(如:Ant)所提供功能的超集。 除了提供構建功能,Maven還可以生成報告,生成Web站點,并且幫助推動工作團隊成員間的交流。
約定優于配置(Convention Over Configuration)
約定優于配置是一個簡單的概念。 系統,類庫,框架應該假定明智合理的默認值,而非總是要求提供不必要的配置。
Maven通過給項目提供明智的默認行為來融合這個概念。 在沒有自定義的情況下,有下列默認配置:
一、源代碼存放目錄:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/java
二、資源文件存放目錄:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/main/resources
三、測試代碼存放目錄:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/src/test
四、編譯好的字節碼存放目錄:/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/target/classes
五、項目假定會產生一個 JAR 文件。故 Maven會在 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/content-zh/target 創建一個可分發的 JAR 文件。
比如,在我本機,用的是 Windows XP 系統,登錄系統的用戶名為 chenlong ,我有一個項目叫 simple-weather,我本機的相關路徑如下:
六、源代碼存放目錄:C:\Documents and Settings\chenlong\simple-weather\src\main\java
七、資源文件存放目錄:C:\Documents and Settings\chenlong\simple-weather\src\main\resources
八、測試代碼存放目錄:C:\Documents and Settings\chenlong\simple-weather\src\test\java
九、測試資源存放目錄:C:\Documents and Settings\chenlong\simple-weather\src\test\resources
十、編譯好的字節碼存放目錄:C:\Documents and Settings\chenlong\simple-weather\target\classes
十一、JAR 文件存放目錄:C:\Documents and Settings\chenlong\simple-weather\target
目錄結構如圖所示:

Maven 對約定優于配置的應用不僅僅是簡單的目錄位置,Maven 的核心插件使用了一組通用的約定,以用來編譯源代碼,打包可分發的構件,生成 web 站點,還有許多其他的過程。 Maven 的力量來自它的"武斷",它有一個定義好的生命周期和一組知道如何構建和裝配軟件的通用插件。如果你遵循這些約定,Maven 只需要你做幾乎為零的工作——僅僅是將你的源代碼放到正確的目錄,然后Maven 將會幫你處理剩下的事情。當然如果你不想遵循約定,Maven 也會允許你自定義默認值來適應你的需求。
一個一般的接口
Maven 為構建軟件提供一個一般的或者說通用的接口。 如果你想參與一個新的項目或者是從頭編譯構建一個開源項目,只要這個項目是使用 Maven 來管理的,那么你就無需花時間去學習這個項目的構建系統,因為他們都遵循 Maven 定義的相同的規范。例如,你從 Subversion 檢出一個項目如 Apache Wicket,然后你只需要運行一下 mvn install 命令來構建它,一切就 OK 了。
基于Maven插件的全局性重用
Maven 有很多優點,包括依賴管理和通過插件重用一般的構建邏輯。Maven 將一般的構建任務抽象成插件,同時這些插件得到了很好的維護以及全局的共享,你不需要從頭開始自定義你項目的構建系統。這就是基于 Maven 插件的全局性重用。
一個“項目”的概念模型
Maven 維護了一個項目的模型,你不僅僅需要把源碼編譯成字節碼,你還需要開發軟件項目的描述信息,為項目指定一組唯一的坐標。你要描述項目的的屬性。項目的許可證是什么?誰開發這個項目,為這個項目做貢獻?這個項目依賴于其它什么項目沒有?Maven不僅僅是一個“構建工具”,它不僅僅是在類似于 make 和 Ant 的工具上的改進,它是包含了一組關于軟件項目和軟件開發的語義規則的平臺。這個基于每一個項目定義的模型實現了如下特征:
依賴管理
由于項目是根據一個包含組標識符,構件標識符和版本的唯一的坐標定義的,故項目間可以使用這些坐標來聲明依賴。
遠程倉庫
和項目依賴相關的,我們可以使用定義在項目對象模型(POM)中的坐標來創建 Maven 構件的倉庫。
全局性構建邏輯重用
插件被編寫成和項目對象模型(POM)一起工作,它們沒有被設計成操作某一個已知位置的特定文件。一切都被抽象到模型中,插件配置和自定義行為都在模型中進行。
工具可移植性/集成
像 Eclipse,NetBeans,和 InteliJ 這樣的工具現在有共同的地方來找到項目的信息。在 Maven 出現之前,每個 IDE 都有不同的方法來存儲實際上是自定義項目對象模型(POM)的信息。Maven 標準化了這種描述,而雖然每個 IDE 仍然繼續維護它的自定義項目文件,但這些文件現在可以很容易的由模型生成。
便于搜索和過濾構件
像 Nexus 這樣的工具允許你使用存儲在 POM 中的信息對倉庫中的內容進行索引和搜索。
一些小技巧:
從命令行運行 mvn install 命令 Maven 就會自動處理資源文件,編譯源代碼,運行單元測試,創建一個 JAR ,然后把這個 JAR 安裝到本地倉庫以為其它項目提供重用性。不用做任何修改,你可以運行 mvn site ,然后在 target/site 目錄找到一個 index.html 文件,這個文件鏈接了 JavaDoc 和一些關于源代碼的報告。
如果你想要運行單元測試,你需要做的只是編寫測試類并放到測試目錄,添加一個對于 TestNG 或者 JUnit 的測試范圍依賴,然后運行 mvn test 。