好的目錄結構可以使開發人員更容易理解項目,為以后的維護工作也打下良好的基礎。Maven2根據業界公認的最佳目錄結構,為開發者提供了缺省的標准目錄模板。Maven2的標准目錄結構如下:
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/assembly | Assembly descriptors |
src/main/config | Configuration files |
src/main/scripts | Application/Library scripts |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt | Notices and attributions required by libraries that the project depends on |
README.txt | Project's readme |
使用目錄模板,可以使 pom.xml 更簡潔。因為 Maven2 已經根據缺省目錄,預定義了相關的動作,而無需人工的干預。以 resources 目錄為例:
- src/main/resources,負責管理項目主體的資源。在使用Maven2執行compile之后,這個目錄中的所有文件及子目錄,會復制到target/classes目錄中,為以后的打包提供了方便。
- src/test/resources,負責管理項目測試的資源。在使用Maven2執行test-compile之后,這個目錄中的所有文件及子目錄,會復制到target/test-classes目錄中,為后續的測試做好了准備。
這些動作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來完成的。如今,完全不需要在pom.xml中指定就能夠自動完成。在src和test都使用resources,方便構建和測試,這種方式本就已是前人的經驗。通過使用Maven2,使這個經驗在開發團隊中得到普及。
創建標准目錄模板,可以通過如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
groupId和artifactId的含義與Maven1中的含義一樣,參數artifactId的值會作為項目根目錄的名字。除了建立相應的目錄之外,Maven2還會創建缺省的pom.xml。
Maven2也考慮到:不同類型的項目需要擁有不同的目錄結構。如創建web項目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
Maven 生命周期
在Maven2中有了明確的生命周期概念,而且都提供與之對應的命令,使得項目構建更加清晰明了。主要的生命周期階段:
- validate,驗證工程是否正確,所有需要的資源是否可用。
- compile,編譯項目的源代碼。
- test-compile,編譯項目測試代碼。
- test,使用已編譯的測試代碼,測試已編譯的源代碼。
- package,已發布的格式,如jar,將已編譯的源代碼打包。
- integration-test,在集成測試可以運行的環境中處理和發布包。
- verify,運行任何檢查,驗證包是否有效且達到質量標准。
- install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
- deploy,在整合或者發布環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
- generate-sources,產生應用需要的任何額外的源代碼,如xdoclet。
如果要執行項目編譯,那么直接輸入:mvn compile即可,對於其他的階段可以類推。階段之間是存在依賴關系(dependency)的,如test依賴test-compile。在執行mvn test時,會先運行mvn test-compile,然后才是mvn test。
Maven 關鍵詞
- Project:
- 任何你想 build 的事物,Maven都會把它們當作是一個 Project。
- 這些 Project 被定義為 POM(Project Object Model)。
- 一個 Project 可以依賴其他的project,一個 project 也可以有多個子project組成。
- POM:
- POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元數據文件,類似 ant 的 build.xml 文件。
- pom.xml 文件應該位於每個 Project 的根目錄。
- GroupId:
- 顧名思義,這個應該是公司名或組織名。
- ArtifactId:
- 構建出來的文件名,一般來說或,這個也是project名。
- Packaging:
- 項目打包的類型,可以是將jar、war、rar、ear、pom,默認是jar。
- Version:
- 項目的版本,項目的唯一標識由 groupId+artifactId+packaging+versionz 組成。
- Dependency:
- 為了能夠 build 或運行,一個典型的java project會依賴其他的包,在Maven中,這些被依賴的包就被稱為 dependency。
- Plug-in:
- Maven是有插件組織的,它的每一個功能都是由插件提供的,主要的插件是由 java 來寫的,但是他也支持 beanshell 和 ant 腳本編寫的插件。
- Repository:
- 倉庫用來存放artifact的,可以是本地倉庫,也可以是遠程倉庫,Maven是由一個默認的倉庫
- Snapshot:
- 工程中可以(也應該)有這樣一個特殊的版本:這個版本可以告訴Maven,該工程正在處於開發階段,會經常更新(但還為發布)。當其他工程依賴此類型的artifact時,Maven會在倉庫中尋找該artifact的最新版本,並自動下載、使用該最新版本。
Maven 常見命令
mvn archetype:create | 創建Maven項目 |
mvn compile | 編譯源代碼 |
mvn test | 運行應用程序中的單元測試 |
mvn install | 在本地Respository中安裝jar |
mvn eclipse:eclipse | 生成eclipse項目文件 |
mvn jetty:run | 啟動jetty服務 |
mvn clean | 清除項目目錄中的生成結果 |
mvn site | 生成項目相關信息的網站 |
mvn package | 根據項目生成的jar |
Maven的默認生命周期
Default Lifecycle | 生命周期階段 | 描述 |
validate | 驗證 | 確保當前配置和 POM 的內容是有效的。這包含對 pom.xml 文件樹的驗證。 |
initialize | 初始化 | 在執行構建生命周期的主任務之前可以進行初始化。 |
generate-sources | 生成源碼 | 代碼生成器可以開始生成在以后階段中處理或編譯的源代碼。 |
process-sources | 處理源碼 | 提供解析、修改和轉換源碼。常規源碼和生成的源碼都可以在這里處理。 |
generate-resources | 生成資源 | 可以生成非源碼資源。通常包括元數據文件和配置文件。 |
process-resources | 處理資源 | 處理非源碼資源。修改、轉換和重定位資源都能在這階段發生。 |
compile | 編譯 | 編譯源碼。編譯過的類被放到目標目錄樹中。 |
process-classes | 處理類 | 處理類文件轉換和增強步驟。字節碼交織器和常用工具常在這一階段操作。 |
generate-test-sources | 生成測試源碼 | mojo 可以生成要操作的單元測試代碼。 |
process-test-sources | 處理測試源碼 | 在編譯前對測試源碼執行任何必要的處理。在這一階段,可以修改、轉換或復制源代碼。 |
generate-test-resources | 生成測試資源 | 允許生成與測試相關的(非源碼)資源。 |
process-test-resources | 處理測試資源 | 可以處理、轉換和重新定位與測試相關的資源。 |
test-compile | 測試編譯 | 編譯單元測試的源碼。 |
process-test-classes | 對測試編譯生成的文件做后期處理(需Maven2.0.5及以上) | |
test | 測試 | 運行編譯過的單元測試並累計結果。 |
prepare-package | 執行打包前的所有操作(需Maven2.1及以上) | |
package | 打包 | 將可執行的二進制文件打包到一個分布式歸檔文件中,如 JAR 或 WAR。 |
pre-integration-test | 前集成測試 | 准備集成測試。這種情況下的集成測試是指在一個受到一定控制的模擬的真 實部署環境中測試代碼。這一步能將歸檔文件部署到一個服務器上執行。 |
integration-test | 集成測試 | 執行真正的集成測試。 |
post-integration-test | 后集成測試 | 解除集成測試准備。這一步涉及測試環境重置或重新初始化。 |
verify | 檢驗 | 檢驗可部署歸檔的有效性和完整性。過了這個階段,將安裝該歸檔。 |
install | 安裝 | 將該歸檔添加到本地 Maven 目錄。這一步讓其他可能依賴該歸檔的模塊可以使用它。 |
deploy | 部署 | 將該歸檔添加到遠程 Maven 目錄。這一步讓這個工件能為更多的人所用。 |