maven的常用命令與多模組專案構建
本節介紹幾個maven常用的命令,以備遺忘時可以檢視。
mvn -version 檢視maven的版本及配置資訊
mvn archetype:create -DgroupId= DartifactId= 構建java專案
mvn archetype:create -DgroupId= DartifactId= -DarchetypeArtifactId=maven-archetype-webapp 建立web專案
mvn compile 編譯專案程式碼
mvn package 打包專案
mvn package -Dmaven.test.skip=true 打包專案時跳過單元測試
mvn test 執行單元測試
mvn clean 清除編譯產生的target資料夾內容,可以配合相應命令一起使用,如mvn clean package, mvn clean test
mvn install 打包後將其安裝在本地倉庫
mvn deploy 打包後將其安裝到pom檔案中配置的遠端倉庫
mvn eclipse:eclipse 將maven生成eclipse專案結構
mvn eclipse:clean 清除maven專案中eclipse的專案結構
mvn site 生成站點目錄
mvn dependency:list 顯示所有已經解析的所有依賴
mvn dependency:tree 以樹的結構展示專案中的依賴
mvn dependency:analyze 對專案中的依賴進行分析,依賴未使用,使用單未引入
mvn dependency:analyze -DfailOnWarning=true 對專案中的依賴進行分析,未使用的依賴項或未宣告的已使用依賴項時,輸出中都會顯示警告
跳過測試的執行:你可以用mvn package -DskipTests=true。或者,您可以將該屬性縮短為-DskipTests.
跳過測試的編譯和執行(不建議):你可以用mvn package -Dmaven.test.skip=true。你可以把財產縮短到-Dmaven.test.skip.
除錯單元測試:你可以用mvn package -Dmaven.surefire.debug.
除錯整合測試:你可以用mvn package -Dmaven.failsafe.debug.
mvn tomcat:run 啟動tomcat
mvn clean install 構建專案
mvn clean dependency:copy-dependencies package 清理和打包
處理並顯示清理生命週期的所有階段: mvn post-clean
介紹
POM代表專案物件模型。它是 Maven 中工作的基本單位,這是一個 XML 檔案。它始終儲存在該專案基本目錄中的 pom.xml
檔案。
POM 包含的專案是使用 Maven 來構建的,它用來包含各種配置資訊。
POM 也包含了目標和外掛。在執行任務或目標時,Maven 會使用當前目錄中的 POM。它讀取POM得到所需要的配置資訊,然後執行目標。部分的配置可以在 POM 使用如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
建立一個POM之前,應該要先決定專案組(groupId),它的名字(artifactId)和版本,因為這些屬性在專案倉庫是唯一標識的。
POM的例子
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yiibai.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<project>
XML
要注意的是,每個專案只有一個POM檔案。
- 所有的 POM 檔案要專案元素必須有三個必填欄位:
groupId
,artifactId
,version
- 在庫中的專案符號是:
groupId:artifactId:version
- pom.xml 的根元素是
project
,它有三個主要的子節點。
節點 | 描述 |
---|---|
groupId | 這是專案組的編號,這在組織或專案中通常是獨一無二的。 例如,一家銀行集團com.company.bank 擁有所有銀行相關專案。 |
artifactId | 這是專案的ID。這通常是專案的名稱。 例如,consumer-banking 。 除了groupId 之外,artifactId 還定義了artifact 在儲存庫中的位置。 |
version |
這是專案的版本。與groupId 一起使用,artifact 在儲存庫中用於將版本彼此分離。 例如:com.company.bank:consumer-banking:1.0 ,com.company.bank:consumer-banking:1.1 |
超級POM
所有的POM繼承自父類(儘管明確界定)。這個基礎的 POM 被稱為超級 POM,幷包含繼承預設值。 Maven使用有效的POM(超級POM加專案配置的配置)執行有關目標。它可以幫助開發人員指定最低配置的詳細資訊寫在 pom.xml
中。雖然配置可以很容易被覆蓋。 一個簡單的方法來看看超級POM的預設配置,通過執行下面的命令:mvn help:effective-pom
建立一個 pom.xml
。 在下面的例子中,已經建立了一個 pom.xml
在C:\MVN\
專案資料夾中。 現在,開啟命令控制檯,進入包含 pom.xml
資料夾並執行以下 mvn
命令。
C:\MVN\project> mvn help:effective-pom
Maven將開始處理,並顯示有效的 effective-pom
。
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.project-group:project-name:jar:1.0
[INFO] task-segment: [help:effective-pom] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:effective-pom {execution: default-cli}]
[INFO]
.....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu Jul 05 11:41:51 IST 2012
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------
在控制檯顯示結果:有效POM,繼承,插值,應用配置檔案。
生命週期
構建生命週期階段的目標是執行順序是一個良好定義的序列。
這裡使用一個例子,一個典型的 Maven 構建生命週期是由下列順序的階段:
階段 | 處理 | 描述 |
---|---|---|
準備資源 | 資源複製 | 資源複製可以進行定製 |
編譯 | 執行編譯 | 原始碼編譯在此階段完成 |
包裝 | 打包 | 建立JAR/WAR包如在 pom.xml 中定義提及的包 |
安裝 | 安裝 | 這一階段在本地/遠端Maven倉庫安裝程式包 |
預設(或生成)生命週期
這是 Maven 主要的生命週期,用於構建應用程式。它有以下 23 個階段。
生命週期階段 | 描述 |
---|---|
validate | 驗證專案是否正確,並且所有必要的資訊可用於完成構建過程 |
initialize | 建立初始化狀態,例如設定屬性 |
generate-sources | 產生任何的原始碼包含在編譯階段 |
process-sources | 處理原始碼,例如,過濾器值 |
generate-resources | 包含在包中產生的資源 |
process-resources | 複製和處理資源到目標目錄,準備打包階段 |
compile | 編譯該專案的原始碼 |
process-classes | 從編譯生成的檔案提交處理,例如:Java類的位元組碼增強/優化 |
generate-test-sources | 生成任何測試的原始碼包含在編譯階段 |
process-test-sources | 處理測試原始碼,例如,過濾器任何值 |
test-compile | 編譯測試原始碼到測試目標目錄 |
process-test-classes | 處理測試程式碼檔案編譯生成的檔案 |
test | 執行測試使用合適的單元測試框架(JUnit) |
prepare-package | 執行必要的任何操作的實際打包之前準備一個包 |
package | 提取編譯後的程式碼,並在其分發格式打包,如JAR,WAR或EAR檔案 |
pre-integration-test | 完成執行整合測試之前所需操作。例如,設定所需的環境 |
integration-test | 處理並在必要時部署軟體包到整合測試可以執行的環境 |
pre-integration-test | 完成整合測試已全部執行後所需操作。例如,清理環境 |
verify | 執行任何檢查,驗證包是有效的,符合質量稽核規定 |
install | 將包安裝到本地儲存庫,它可以用作當地其他專案的依賴 |
deploy | 複製最終的包到遠端倉庫與其他開發者和專案共享 |
有涉及到Maven 生命週期值得一提幾個重要概念:
-
當一個階段是通過 Maven命令呼叫,例如:mvn compile,只有階段到達幷包括這個階段才會被執行。
-
不同的 Maven 目標繫結到 Maven生命週期的不同階段這是這取決於包型別(JAR/WAR/EAR)。
Maven多模組專案
Maven多模組專案,適用於一些比較大的專案,通過合理的模組拆分,實現程式碼的複用,便於維護和管理。尤其是一些開源框架,也是採用多模組的方式,提供外掛整合,使用者可以根據需要配置指定的模組。
專案結構如下:
test-hd-parent (父級)
---pom.xml
---test-hd-api (第三方介面層)
----pom.xml
---test-hd-foundation (基礎工具層)
----pom.xml
---test-hd-resource (資源層)
----pom.xml
---test-hd-service (邏輯業務層)
----pom.xml
---test-hd-modules (web層)
----pom.xml
---test-hd-www (web模組1)
----pom.xml
---test-hd-admin (web模組2)
----pom.xml
建立一個父maven工程
- 新建一個maven專案,選擇儲存位置,並選擇建立一個簡單的maven工程
- 輸入Group Id、Artifact Id、Packaging,packaging選擇pom包
- 生成父工程,pom.xml如下
- 刪除工程中的src 目錄
建立子模組
- 右擊父工程名---》New---》Project,然後選擇新建一個maven module工程
- 設定子工程名以及父工程,再設定快速建立模式
- 得到子工程(test-hd-api,第三方介面層),設定編譯的jdk
- 同理設定,子模組:test-hd-foundation(基礎工具層)、test-hd-resource(資源層) 、test-hd-service(邏輯業務層)
- 新建test-hd-modules (web層),選擇建立一個a simple project,輸入Group Id、Artifact Id、Packaging,packaging選擇pom包
建立web子模組
- web子模組在建在test-hd-modules (web層)裡面,右擊test-hd-modules 工程名---》New---》Project,然後選擇新建一個maven module工程,設定子工程名以及父工程,選擇新建web專案
- 配置maven web專案,參照:【Maven】Eclipse 使用Maven建立Java Web專案
- 同理可以配置其他的web子模組 test-hd-admin(web模組2)
配置個模組的依賴
- 在parent專案pom.xml中建立依賴管理(dependencyManagement)
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.hd</groupId> 5 <artifactId>test-hd-parent</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 <packaging>pom</packaging> 8 <modules> 9 <module>test-hd-api</module> 10 <module>test-hd-service</module> 11 <module>test-hd-resource</module> 12 <module>test-hd-foundation</module> 13 <module>test-hd-modules</module> 14 </modules> 15 16 17 <!-- maven依賴 --> 18 <dependencyManagement> 19 20 <dependencies> 21 <!-- hd --> 22 <dependency> 23 <groupId>com.hd</groupId> 24 <artifactId>test-hd-api</artifactId> 25 <version>0.0.1-SNAPSHOT</version> 26 </dependency> 27 28 <dependency> 29 <groupId>com.hd</groupId> 30 <artifactId>test-hd-service</artifactId> 31 <version>0.0.1-SNAPSHOT</version> 32 </dependency> 33 34 <dependency> 35 <groupId>com.hd</groupId> 36 <artifactId>test-hd-resource</artifactId> 37 <version>0.0.1-SNAPSHOT</version> 38 </dependency> 39 40 <dependency> 41 <groupId>com.hd</groupId> 42 <artifactId>test-hd-foundation</artifactId> 43 <version>0.0.1-SNAPSHOT</version> 44 </dependency> 45 46 <!-- Servlet --> 47 <dependency> 48 <groupId>javax.servlet</groupId> 49 <artifactId>javax.servlet-api</artifactId> 50 <version>3.0.1</version> 51 <scope>provided</scope> 52 </dependency> 53 <dependency> 54 <groupId>javax.servlet.jsp</groupId> 55 <artifactId>jsp-api</artifactId> 56 <version>2.2</version> 57 <scope>provided</scope> 58 </dependency> 59 60 <!-- jstl --> 61 <dependency> 62 <groupId>javax.servlet</groupId> 63 <artifactId>jstl</artifactId> 64 <version>1.2</version> 65 </dependency> 66 67 <dependency> 68 <groupId>taglibs</groupId> 69 <artifactId>standard</artifactId> 70 <version>1.1.2</version> 71 </dependency> 72 73 <dependency> 74 <groupId>junit</groupId> 75 <artifactId>junit</artifactId> 76 <version>3.8.1</version> 77 <scope>test</scope> 78 </dependency> 79 80 </dependencies> 81 </dependencyManagement> 82 83 </project>
- test-hd-foundation中的依賴
1 <?xml version="1.0"?> 2 <project 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 4 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 5 <modelVersion>4.0.0</modelVersion> 6 <parent> 7 <groupId>com.hd</groupId> 8 <artifactId>test-hd-parent</artifactId> 9 <version>0.0.1-SNAPSHOT</version> 10 </parent> 11 <artifactId>test-hd-foundation</artifactId> 12 13 <dependencies> 14 15 <!-- servlet --> 16 <dependency> 17 <groupId>javax.servlet</groupId> 18 <artifactId>jstl</artifactId> 19 </dependency> 20 21 <dependency> 22 <groupId>taglibs</groupId> 23 <artifactId>standard</artifactId> 24 </dependency> 25 26 <dependency> 27 <groupId>junit</groupId> 28 <artifactId>junit</artifactId> 29 </dependency> 30 </dependencies> 31 32 <build> 33 <plugins> 34 <!-- define the project compile level --> 35 <plugin> 36 <groupId>org.apache.maven.plugins</groupId> 37 <artifactId>maven-compiler-plugin</artifactId> 38 <version>2.3.2</version> 39 <configuration> 40 <source>1.7</source> 41 <target>1.7</target> 42 </configuration> 43 </plugin> 44 </plugins> 45 </build> 46 </project>
以下幾個同上
- test-hd-api中的依賴關係
- test-hd-resource中的依賴關係
- test-hd-service中的依賴關係
- test-hd-module中的依賴關係
- test-hd-www中的依賴關係
- 最後使用maven-update整個工程,右擊父工程名--》Maven--》Update Project
打包和釋出
- 打包,右擊父工程名 test-hd-parent---->Run As--->Maven Install
- 打包web子工程,右擊工程名test-hd-www--->Run As ---> Maven Build...---> Goals: clean package--->Run
- 右擊工程名test-hd-www,進行重新整理,找到war包,放到tomcat的webapps中,啟動tomcat,即可訪問工程http://localhost:8080/test-hd-www
- 可以去tomcat下面webapps》test-hd-www》WEB-INF》lib中,看到引用的jar包