Maven系列第6篇:生命週期和外掛詳解,此篇看過之後在maven的理解上可以超越同級別90%的人!
maven系列目標:從入門開始開始掌握一個高階開發所需要的maven技能。
這是maven系列第6篇。
整個maven系列的內容前後是有依賴的,如果之前沒有接觸過maven,建議從第一篇看起,本文尾部有maven完整系列的連線。
前面我們使用maven過程中,用到了一些命令,如下:
mvn clean
mvn compile
mvn test
mvn package
mvn install
mvn install -Dmaven.test.skip=true
mvn deploy
mvn help:system
上面這些命令,如果你玩過maven,估計大家還是比較眼熟的,只是大家有沒有想過這些命令為什麼這麼寫,為什麼-Dmaven.test.skip=true
mvn
命令背後的一些原理,這就是本文的主要內容,廢話不多說,上乾貨。
本文主要內容
- 使用者自定義屬性的使用
- maven生命週期詳解
- maven外掛詳解
使用者屬性Properties的使用
專案pom.xml中,有下面這樣一段依賴:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.1.RELEASE</version> </dependency> </dependencies>
大家看一下上面的配置,有沒有什麼問題?
他們的groupId和version都是一樣的,程式設計師面對與重複的程式碼,需要提取,如果是java程式碼中,我們可以將同樣的程式碼或者變數值,提取成方法或者變數,做到重用,方便維護。
那麼maven的pom.xml中也支援這麼做:
<properties> <spring.group>org.springframework</spring.group> <spring.version>5.2.1.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>${spring.group}</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>${spring.group}</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>${spring.group}</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
大家看一下上面的程式碼,properties
位於pom.xml中的,是project
元素的子元素,使用者可以在properties
中自定義一些使用者屬性,然後可以在其他地方使用${屬性名稱}
這種方式進行引用。
生命週期
我們開發一個專案的時候,通常有這些環節:建立專案、編寫程式碼、清理已編譯的程式碼、編譯程式碼、執行單元測試、打包、整合測試、驗證、部署、生成站點等,這些環節組成了專案的生命週期,這些過程也叫做專案的構建過程,幾乎所有的專案都由這些環節中的其中幾個,建立專案和編寫程式碼是我們程式設計師需要多參與的,其他的都可以做成自動化的方式。
用過ant的朋友回憶一下,在maven出現以前,開發人員每天都在對專案進行清理、編譯、執行單元測試、打包、部署等操作,雖然大家都在做這些工作,但是沒有一個統一的標準,專案和專案之間,公司和公司之間,大多數都是各寫各的,寫法是千奇百怪,能滿足自身需求就可以了,但是換個專案就得從頭再來,這些操作又需要重新編寫指令碼。
而maven出來之後,專案生命週期中的這些環節都被簡化了,被規範化了,maven出現之前,專案的結構沒有一個統一的標準,所以生命週期中各個環節對應的自動化指令碼也是各種各樣,而maven約定好了專案的結構,原始碼的位置、資原始檔的位置、測試程式碼的位置、測試用到的資原始檔的位置、靜態資源的位置、打包之後檔案的位置等,這些都是maven約定好的,所以清理程式碼用一個命令mvn clean
就可以完成,不需要我們去配置清理的目標目錄;用mvn compile
命令就可以完成編譯的操作;用mvn test
就可以自動執行測試用例;用mvn package
就可以將專案打包為jar、war
格式的包,能夠如此簡單,主要還是maven中約定大於配置的結果。
maven中生命週期詳解
maven將專案的生命週期抽象成了3套生命週期,每套生命週期又包含多個階段,每套中具體包含哪些階段是maven已經約定好的,但是每個階段具體需要做什麼,是使用者可以自己指定的。
maven中定義的3套生命週期:
- clean生命週期
- default生命週期
- site生命週期
上面這3套生命週期是相互獨立的,沒有依賴關係的,而每套生命週期中有多個階段,每套中的多個階段是有先後順序的,並且後面的階段依賴於前面的階段,而使用者可以直接使用mvn
命令來呼叫這些階段去完成專案生命週期中具體的操作,命令是:
mvn 生命週期階段
通俗點解釋:
maven中的3套生命週期相當於maven定義了3個類來解決專案生命週期中需要的各種操作,每個類中有多個方法,這些方法就是指具體的階段,方法名稱就是階段的名稱,每個類的方法是有順序的,當執行某個方法的時候,這個方法前面的方法也會執行。具體每個方法中需要執行什麼,這個是通過外掛的方式讓使用者去配置的,所以非常靈活。
使用者執行
mvn 階段名稱
就相當於呼叫了具體的某個方法。
下面我們來看看每個生命週期中有哪些階段(也就是我們說的每個類中有哪些方法,順序是什麼樣的)。
clean生命週期
clean生命週期的目的是清理專案,它包含三個階段:
生命週期階段 | 描述 |
---|---|
pre-clean | 執行一些需要在clean之前完成的工作 |
clean | 移除所有上一次構建生成的檔案 |
post-clean | 執行一些需要在clean之後立刻完成的工作 |
使用者可以通過mvn pre-clean
來呼叫clean生命週期中的pre-clean
階段需要執行的操作。
呼叫mvn post-clean
會執行上面3個階段所有的操作,上文中有說過,每個生命週期中的後面的階段會依賴於前面的階段,當執行某個階段的時候,會先執行其前面的階段。
default生命週期
這個是maven主要的生命週期,主要被用於構建應用,包含了23個階段。
生命週期階段 | 描述 |
---|---|
validate | 校驗:校驗專案是否正確並且所有必要的資訊可以完成專案的構建過程。 |
initialize | 初始化:初始化構建狀態,比如設定屬性值。 |
generate-sources | 生成原始碼:生成包含在編譯階段中的任何原始碼。 |
process-sources | 處理原始碼:處理原始碼,比如說,過濾任意值。 |
generate-resources | 生成資原始檔:生成將會包含在專案包中的資原始檔。 |
process-resources | 編譯:複製和處理資源到目標目錄,為打包階段最好準備。 |
compile | 處理類檔案:編譯專案的原始碼。 |
process-classes | 處理類檔案:處理編譯生成的檔案,比如說對Java class檔案做位元組碼改善優化。 |
generate-test-sources | 生成測試原始碼:生成包含在編譯階段中的任何測試原始碼。 |
process-test-sources | 處理測試原始碼:處理測試原始碼,比如說,過濾任意值。 |
generate-test-resources | 生成測試原始檔:為測試建立資原始檔。 |
process-test-resources | 處理測試原始檔:複製和處理測試資源到目標目錄。 |
test-compile | 編譯測試原始碼:編譯測試原始碼到測試目標目錄. |
process-test-classes | 處理測試類檔案:處理測試原始碼編譯生成的檔案。 |
test | 測試:使用合適的單元測試框架執行測試(Juint是其中之一)。 |
prepare-package | 準備打包:在實際打包之前,執行任何的必要的操作為打包做準備。 |
package | 打包:將編譯後的程式碼打包成可分發格式的檔案,比如JAR、WAR或者EAR檔案。 |
pre-integration-test | 整合測試前:在執行整合測試前進行必要的動作。比如說,搭建需要的環境。 |
integration-test | 整合測試:處理和部署專案到可以執行整合測試環境中。 |
post-integration-test | 整合測試後:在執行整合測試完成後進行必要的動作。比如說,清理整合測試環境。 |
verify | 驗證:執行任意的檢查來驗證專案包有效且達到質量標準。 |
install | 安裝:安裝專案包到本地倉庫,這樣專案包可以用作其他本地專案的依賴。 |
deploy | 部署:將最終的專案包複製到遠端倉庫中與其他開發者和專案共享。 |
site生命週期
site生命週期的目的是建立和釋出專案站點,Maven能夠基於pom.xml所包含的資訊,自動生成一個友好的站點,方便團隊交流和釋出專案資訊。主要包含以下4個階段:
階段 | 描述 |
---|---|
pre-site | 執行一些需要在生成站點文件之前完成的工作 |
site | 生成專案的站點文件 |
post-site | 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備 |
site-deploy | 將生成的站點文件部署到特定的伺服器上 |
mvn命令和生命週期
從命令列執行maven任務的最主要方式就是呼叫maven生命週期的階段,需要注意的是,每套生命週期是相互獨立的,但是每套生命週期中階段是有前後依賴關係的,執行某個的時候,會按序先執行其前面所有的。
mvn執行階段的命令格式是:
mvn 階段1 [階段2] [階段n]
多個階段的名稱之間用空格隔開。
下面我們舉一些常見的例子來說明一下:
mvn clean
該命令是呼叫clean生命週期的clean階段,實際執行的階段為clean生命週期中的pre-clean和clean階段。
mvn test
該命令呼叫default生命週期的test階段,實際上會從default生命週期的第一個階段(validate
)開始執行一直到test
階段結束。這裡麵包含了程式碼的編譯,執行測試用例。
mvn clean install
這個命令中執行了兩個階段:clean
和install
,從上面3個生命週期的階段列表中找一下,可以看出clean
位於clean
生命週期的表格中,install
位於default
生命週期的表格中,所以這個命令會先從clean
生命週期中的pre-clean
階段開始執行一直到clean
生命週期的clean
階段;然後會繼續從default
生命週期的validate
階段開始執行一直到default生命週期的install
階段。
這裡麵包含了清理上次構建的結果,編譯程式碼,測試,打包,將打好的包安裝到本地倉庫。
mvn clean deploy
這個命令也比較常用,會先按順序執行clean
生命週期的[pre-clean,clean]
這個閉區間內所有的階段,然後按序執行default
生命週期的[validate,deploy]
這個閉區間內的所有階段(也就是default
生命週期中的所有階段)。這個命令內部包含了清理上次構建的結果、編譯程式碼、執行單元測試、打包、將打好的包安裝到本地倉庫、將打好的包釋出到私服倉庫。
上面說了這麼多理論,我們來看一下效果。
案例
建立一個maven專案
開啟idea,點選File->New->Project
,選擇Maven
,如下:
點選Next
,輸入專案座標資訊,如下:
點選Next
,輸入Project name 為maven-chat06
,如下:
點選Finish
,建立成功,如下:
配置一下idea的maven環境,點選File->Settings
,如下圖:
點選上面的OK
完成配置。
還原~/.m2/settings.xml
的配置到初始狀態,操作如下:
將M2_HOME/conf/settings.xml複製到~/.m2/settings.xml目錄,如果存在先備份一個,然後進行覆蓋。
maven專案是約定大於配置的,專案結構是按照maven的約定生成好的,關於maven約定專案結構,我們再來回顧一下。
Maven 提倡使用一個共同的標準目錄結構,Maven 使用約定優於配置的原則,大家儘可能的遵守這樣的目錄結構,如下所示:
目錄 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目錄 |
${basedir}/src/main/java | 專案的java原始碼 |
${basedir}/src/main/resources | 專案的資源,比如說property檔案,springmvc.xml |
${basedir}/src/test/java | 專案的測試類,比如說Junit程式碼 |
${basedir}/src/test/resources | 測試用的資源 |
${basedir}/src/main/webapp/WEB-INF | web應用檔案目錄,web專案的資訊,比如存放web.xml、本地圖片、jsp檢視頁面 |
${basedir}/target | 打包輸出目錄 |
${basedir}/target/classes | 編譯輸出目錄 |
${basedir}/target/test-classes | 測試編譯輸出目錄 |
Test.java | Maven只會自動執行符合該命名規則的測試類 |
~/.m2/repository | Maven預設的本地倉庫目錄位置 |
結合剛才專案的結構和這個表格領會一下,下面我們來感受一下執行生命週期中的階段產生的效果。
修改pom.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.javacode2018</groupId>
<artifactId>maven-chat06</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置maven編譯的時候採用的編譯器版本 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<!-- 指定原始碼是什麼版本的,如果原始碼和這個版本不符將報錯,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-source引數 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 該命令用於指定生成的class檔案將保證和哪個版本的虛擬機器進行相容,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-target引數 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
上面properties這個元素中的配置,可能大家看不懂,先略過,後面會詳解。
建立一個Demo類,原始碼是放在src/main/java目錄中,如下:
package com.javacode2018.maven;
import java.util.ArrayList;
import java.util.List;
public class Demo1 {
public static void main(String[] args) {
System.out.println("歡迎和【路人甲java】一起學習maven,帶你成為maven高手!");
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
list.forEach(System.out::print);
}
}
mvn clean命令效果
在當前專案pom.xml所在目錄中執行下面命令:
mvn clean
效果如下:
D:\code\IdeaProjects\maven-chat06>mvn clean
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.477 s
[INFO] Finished at: 2019-11-15T18:46:13+08:00
[INFO] ------------------------------------------------------------------------
上面有提到編譯、打包的內容都放在target
目錄,看上面輸出中有個Deleting target目錄
,說明mvn clean
是對這個目錄進行清理,這個目錄中目前是空的。
mvn compile命令效果
先看一下專案的目錄中是沒有target目錄的,如下圖:
cmd中執行:
mvn compile
輸出:
D:\code\IdeaProjects\maven-chat06>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.897 s
[INFO] Finished at: 2019-11-15T18:53:12+08:00
[INFO] ------------------------------------------------------------------------
可以看到上面有Compiling 1 source ....
,這個是編譯Demo.java
,然後輸出到了target中的classes目錄,再來看一下專案的結構,如下圖:
上圖中匡紅的是新生成的。
mvn clean package效果
D:\code\IdeaProjects\maven-chat06>mvn clean package
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat06 ---
[INFO] Building jar: D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.177 s
[INFO] Finished at: 2019-11-15T18:56:59+08:00
[INFO] ------------------------------------------------------------------------
從輸出中看一下,有個Building jar ...
,生成了一個jar包,這個專案的pom.xml中的packaging元素沒有指定值,那就取預設值jar,表示這個構件是一個jar包,mvn clean package
先清理編譯的程式碼,然後執行了default生命週期的compile
階段,將專案打成了jar放在了target目錄,如下圖:
大家看到上面還有很多其他的輸出,這個大家可以先忽略,本文看完了,都會明白的。
mvn clean install效果
D:\code\IdeaProjects\maven-chat06>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat06 ---
[INFO] Building jar: D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ maven-chat06 ---
[INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\maven-chat06\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.977 s
[INFO] Finished at: 2019-11-15T19:05:21+08:00
[INFO] ------------------------------------------------------------------------
和mvn clean package
的輸出對比一下,多了幾行輸出,主要是多了2個Installing...
,將專案打成jar包以及專案的pom檔案放到本地倉庫去了,也就是將構件打包安裝到本地倉庫了。
上面幾個mvn命令的案例,都是通過mvn命令去執行了mvn中定義的生命週期中的階段,然後完成了很多看似內部很複雜的操作。比如打包,內部包含很多複雜的操作,maven都幫我們遮蔽了,通過一個簡單的mvn package
就完成了。
上面也有說過,每個階段具體做的事情是由maven外掛來完成的。
我們在回頭看一下上面一個輸出中,有很多類似於maven-xxxx-plugin:版本:xxx
這樣的內容,這個就是表示當前在執行這個外掛來完成對應階段的操作,mvn 階段
明明執行的是階段,但是實際輸出中確實外掛在幹活,那麼階段是如何和外掛關聯起來的呢?外掛又是什麼呢?
注意以下所有命令都在cmd視窗執行,執行位置位於上面這個專案的pom.xml所在目錄。
Maven外掛
maven外掛主要是為maven中生命週期中的階段服務的,maven中只是定義了3套生命週期,以及每套生命週期中有哪些階段,具體每個階段中執行什麼操作,完全是交給外掛去幹的。
maven中的外掛就相當於一些工具,比如編譯程式碼的工具,執行測試用例的工具,打包程式碼的工具,將程式碼上傳到本地倉庫的工具,將程式碼部署到遠端倉庫的工具等等,這些都是maven中的外掛。
外掛可以通過mvn
命令的方式呼叫直接執行,或者將外掛和maven生命週期的階段進行繫結,然後通過mvn 階段
的方式執行階段的時候,會自動執行和這些階段繫結的外掛。
外掛目標
maven中的外掛以jar的方式存在於倉庫中,和其他構件是一樣的,也是通過座標進行訪問,每個外掛中可能為了程式碼可以重用,一個外掛可能包含了多個功能,比如編譯程式碼的外掛,可以編譯原始碼、也可以編譯測試程式碼;外掛中的每個功能就叫做外掛的目標(Plugin Goal),每個外掛中可能包含一個或者多個外掛目標(Plugin Goal)。
目標引數
外掛目標是用來執行任務的,那麼執行任務肯定是有引數配的,這些就是目標的引數,每個外掛目標對應於java中的一個類,引數就對應於這個類中的屬性。
列出外掛所有目標
mvn 外掛goupId:外掛artifactId[:外掛version]:help
mvn 外掛字首:help
上面外掛字首的先略過,我們先看第一種效果。
如:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
[INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
Maven Clean Plugin
The Maven Clean Plugin is a plugin that removes files generated at build-time
in a project's directory.
This plugin has 2 goals:
clean:clean
Goal which cleans the build.
This attempts to clean a project's working directory of the files that were
generated at build-time. By default, it discovers and deletes the directories
configured in project.build.directory, project.build.outputDirectory,
project.build.testOutputDirectory, and project.reporting.outputDirectory.
Files outside the default may also be included in the deletion by configuring
the filesets tag.
clean:help
Display help information on maven-clean-plugin.
Call
mvn clean:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.
上面列出了
maven-clean-plugin
這個外掛所有的目標,有2個,分別是clean:clean、clean:help
,分號後面的部分是目標名稱,分號前面的部分是外掛的字首,每個目標的後面包含對這個目標的詳細解釋說明,關於字首的後面會有詳細介紹。
檢視外掛目標引數列表
mvn 外掛goupId:外掛artifactId[:外掛version]:help -Dgoal=目標名稱 -Ddetail
mvn 外掛字首:help -Dgoal=目標名稱 -Ddetail
上面命令中的
-Ddetail
使用者輸出目標詳細的引數列表資訊,如果沒有這個,目標的引數列表不會輸出出來,看效果。
如:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
[INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
Maven Clean Plugin
The Maven Clean Plugin is a plugin that removes files generated at build-time
in a project's directory.
clean:help
Display help information on maven-clean-plugin.
Call
mvn clean:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.
Available parameters:
detail (Default: false)
If true, display all settable properties for each goal.
Expression: ${detail}
goal
The name of the goal for which to show help. If unspecified, all goals
will be displayed.
Expression: ${goal}
indentSize (Default: 2)
The number of spaces per indentation level, should be positive.
Expression: ${indentSize}
lineLength (Default: 80)
The maximum length of a display line, should be positive.
Expression: ${lineLength}
上面列出了clean
外掛的help
目標的詳細引數資訊。
注意上面引數詳細引數說明中有Expression: ${xxx}
這樣的部分,這種表示給這個執行的目標傳參,可以通過mvn -Dxxx
這種方式傳參,xxx
為${xxx}
中的xxx
部分,這個xxx
有時候和目標引數的名稱不一致,所以這點需要注意,執行帶引數的目標,看一下效果:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail=false
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
[INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
Maven Clean Plugin
The Maven Clean Plugin is a plugin that removes files generated at build-time
in a project's directory.
clean:help
Display help information on maven-clean-plugin.
Call
mvn clean:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.332 s
[INFO] Finished at: 2019-11-18T15:14:56+08:00
[INFO] ------------------------------------------------------------------------
上面傳了一個detail=false
,上面未輸出目標的詳細引數資訊。
命令列執行外掛
mvn 外掛goupId:外掛artifactId[:外掛version]:外掛目標 [-D目標引數1] [-D目標引數2] [-D目標引數n]
mvn 外掛字首:外掛目標 [-D目標引數1] [-D目標引數2] [-D目標引數n]
案例:
maven中執行測試用例使用到的外掛座標是:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
</dependency>
我們看一下這個外掛有哪些目標:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:help
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:help (default-cli) @ maven-chat06 ---
[INFO] Maven Surefire Plugin 2.12.4
Surefire is a test framework project.
This plugin has 2 goals:
surefire:help
Display help information on maven-surefire-plugin.
Call mvn surefire:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
surefire:test
Run tests using Surefire.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.662 s
[INFO] Finished at: 2019-11-18T15:26:26+08:00
[INFO] ------------------------------------------------------------------------
maven-surefire-plugin外掛有2個目標
help
和test
,描述中可以看出test
目標是用來執行測試用例的。
我們看一下test
目標對應的引數列表:
test目標對應的引數太多,我們只列出了部分引數,如下:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:help -Dgoal=test -Ddetail=true
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:help (default-cli) @ maven-chat06 ---
[INFO] Maven Surefire Plugin 2.12.4
Surefire is a test framework project.
surefire:test
Run tests using Surefire.
Available parameters:
skip (Default: false)
Set this to 'true' to bypass unit tests entirely. Its use is NOT
RECOMMENDED, especially if you enable it using the 'maven.test.skip'
property, because maven.test.skip disables both running the tests and
compiling the tests. Consider using the skipTests parameter instead.
大家認真看一下
skip
這個引數說明,這個引數預設是false,如果設定為true
的時候,專案將跳過測試程式碼的編譯和測試用例的執行
,可以maven.test.skip
這個屬性來進行命令列傳參,將其傳遞給test
目標的skip
屬性,這個通過-D
傳遞的引數名稱就和目標引數名稱不一樣了,所以需要注意-D
後面並不一定是引數名稱。
我們來執行一下test目標看看效果。
先看一下不加引數的效果:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ maven-chat06 ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.640 s
[INFO] Finished at: 2019-11-18T15:33:48+08:00
[INFO] ------------------------------------------------------------------------
加maven.skip.test=true
的效果如下:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.652 s
[INFO] Finished at: 2019-11-18T15:34:45+08:00
[INFO] ------------------------------------------------------------------------
對比一下上面2個輸出,下面的多了一行如下:
[INFO] Tests are skipped.
說明跳過了測試的執行。
外掛傳參的2種方式
剛才上面講了一種通過-D
後面跟使用者屬性的方式給使用者傳參,還有一種方式,在pom.xml中properties
的使用者自定義屬性中進行配置,如下:
修改專案maven-chat06
的pom.xml,properties
中加入:
<maven.test.skip>true</maven.test.skip>
cmd中執行:
mvn org.apache.maven.plugins:maven-surefire-plugin:test
效果如下:
D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.638 s
[INFO] Finished at: 2019-11-18T15:46:04+08:00
[INFO] ------------------------------------------------------------------------
輸出中也有Tests are skipped.
,說明也跳過了測試,和-Dmaven.test.skip=true
效果一樣。
上面說的都是外掛目標的東西,那麼外掛目標是如何和生命週期關聯起來的呢?繼續向下看。
獲取外掛目標詳細描述資訊的另外一種方式
mvn help:describe -Dplugin=外掛goupId:外掛artifactId[:外掛version] -Dgoal=目標名稱 -Ddetail
mvn help:describe -Dplugin=外掛字首 -Dgoal=目標名稱 -Ddetail
上面這個命令呼叫的是help外掛的
describe
這個目標,這個目標可以列出其他指定外掛目標的詳細資訊,看效果:
D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin -Dgoal=test -Ddetail
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:describe (default-cli) @ maven-chat06 ---
[INFO] Mojo: 'surefire:test'
surefire:test
Description: Run tests using Surefire.
Implementation: org.apache.maven.plugin.surefire.SurefirePlugin
Language: java
Bound to phase: test
Available parameters:
additionalClasspathElements
Additional elements to be appended to the classpath.
argLine
User property: argLine
Arbitrary JVM options to set on the command line.
skip (Default: false)
User property: maven.test.skip
Set this to 'true' to bypass unit tests entirely. Its use is NOT
RECOMMENDED, especially if you enable it using the 'maven.test.skip'
property, because maven.test.skip disables both running the tests and
compiling the tests. Consider using the skipTests parameter instead.
可以拿這種和上面獲取外掛目標引數詳情列表對比一下,上面這個更詳細一些,引數說明中多了一行User property: 屬性名稱
,這個屬性名稱可以通過兩種方式傳遞:
- mvn命令
-D屬性名稱
的方式傳遞 - pom.xml中
properties
中定義的方式指定。
現在可以大家估計可以知道我們一直用的-Dmaven.test.skip
為什麼可以跳過測試程式碼的編譯和單元測試的執行了吧。
外掛字首
執行外掛的時候,可以通過指定外掛座標的方式執行,但是外掛的座標資訊過於複雜,也不方便寫和記憶,所以maven中給外掛定義了一些簡捷的外掛字首,可以通過外掛字首來執行指定的外掛。
可以通過下面命令檢視到外掛的字首:
mvn help:describe -Dplugin=外掛goupId:外掛artifactId[:外掛version]
示例效果:
D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:describe (default-cli) @ maven-chat06 ---
[INFO] org.apache.maven.plugins:maven-surefire-plugin:2.12.4
Name: Maven Surefire Plugin
Description: Surefire is a test framework project.
Group Id: org.apache.maven.plugins
Artifact Id: maven-surefire-plugin
Version: 2.12.4
Goal Prefix: surefire
輸出中的
Goal Prefix:
部分對應的就是外掛的字首,上面這個外掛的字首是surefire
。
我們使用字首來執行一下外掛感受一下效果:
D:\code\IdeaProjects\maven-chat06>mvn surefire:test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.934 s
[INFO] Finished at: 2019-11-18T16:18:42+08:00
[INFO] ------------------------------------------------------------------------
上面通過別名來執行外掛
maven-surefire-plugin
的test
目標,是不是簡潔了很多。
上面用了很多mvn help:
這個命令,這個呼叫的是maven-help-plugin
外掛的功能,help
是外掛的字首,它的座標是:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
</dependency>
外掛和生命週期階段繫結
maven只是定義了生命週期中的階段,而沒有定義每個階段中具體的實現,這些實現是由外掛的目標來完成的,所以需要將階段和外掛目標進行繫結,來讓外掛目標幫助生命週期的階段做具體的工作,生命週期中的每個階段支援繫結多個外掛的多個目標。
當我們將生命週期中的階段和外掛的目標進行繫結的時候,執行mvn 階段
就可以執行和這些階段繫結的外掛目標
。
maven內建外掛以及繫結
maven為了讓我們不用做任何配置就可以實現一些專案的構建操作,比如執行mvn clean
就可以幫我們清理程式碼,執行mvn install
就可以將構件安裝到本地倉庫,所以maven幫我們做了一些事情,maven內部已經提供了很多預設的外掛,而將一些階段預設和這些外掛階段繫結好了,所以我們不用做任何配置就可以執行清理程式碼、編譯程式碼、測試、打包、安裝到本地倉庫、上傳到遠端倉庫等階段的操作,是因為maven已經預設給這些階段繫結好了外掛目標,所以不需要我們再去配置,就直接可以執行,這些都是maven內建繫結幫我們做的事情,我們來看看maven有哪些內建繫結。
maven內建繫結
clean生命週期階段與外掛繫結關係
生命週期階段 | 外掛:目標 |
---|---|
pre-clean | |
clean | maven-clean-plugin:clean |
post-clean |
clean週期中只有clean階段預設綁定了
maven-clean-plugin
外掛的clean
目標。maven-clean-plugin
外掛的clean
目標作用就是刪除專案的輸出目錄。
default生命週期階段與外掛繫結關係
default生命週期中有23個階段,我只列出有預設繫結的,其他的沒有列出的沒有繫結任何外掛,因此沒有任何實際的行為。
生命週期階段 | 外掛:目標 | 執行任務 |
---|---|---|
process-resources | maven-resources-plugin:resources | 複製主資原始檔至主輸出目錄 |
compile | maven-compiler-plugin:compile | 編譯主程式碼至主輸出目錄 |
process-test-resources | maven-resources-plugin:testResources | 複製測試資原始檔至測試輸出目錄 |
test-compile | maven-compiler-plugin:testCompile | 編譯測試程式碼至測試輸出目錄 |
test | maven-surefile-plugin:test | 執行測試用例 |
package | maven-jar-plugin:jar | 建立專案jar包 |
install | maven-install-plugin:install | 將輸出構件安裝到本地倉庫 |
deploy | maven-deploy-plugin:deploy | 將輸出的構件部署到遠端倉庫 |
site生命週期階段與外掛繫結關係
生命週期階段 | 外掛:目標 |
---|---|
pre-site | |
site | maven-site-plugin:site |
post-site | |
site-deploy | maven-site-plugin:deploy |
來幾個案例解說一下。
mvn clean
該命令是呼叫clean生命週期的clean階段,實際執行的階段為clean生命週期中的pre-clean和clean階段,從上面內建繫結表格中找一下,可以看到只有clean
階段綁定了maven-clean-plugin
外掛的clean
目標,所以執行mvn clean
的時候,實際上會呼叫maven-clean-plugin
外掛的clean
目標來清理程式碼。
執行一下看一下效果:
D:\code\IdeaProjects\maven-chat06>mvn clean
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.408 s
[INFO] Finished at: 2019-11-18T16:34:14+08:00
[INFO] ------------------------------------------------------------------------
上面有一行輸出如下:
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
這個表示呼叫的外掛是:maven-clean-plugin
,版本是:2.5
,外掛的目標是:clean
mvn test
該命令呼叫default生命週期的test階段,實際上會從default生命週期的第一個階段(validate
)開始執行一直到test
階段結束。這裡麵包含了程式碼的編譯,執行測試用例。還是和上面的分析過程一樣,對照上面表格中的繫結關係,可以得到mvn test
會呼叫下面一些外掛的目標:
maven-resources-plugin:resources
maven-compiler-plugin:compile
maven-resources-plugin:testResources
maven-compiler-plugin:testCompile
maven-surefile-plugin:test
我們來驗證一下,看看是不是和我們分析的一樣:
D:\code\IdeaProjects\maven-chat06>mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.880 s
[INFO] Finished at: 2019-11-18T16:36:55+08:00
[INFO] ------------------------------------------------------------------------
從上面輸出中可以看到呼叫了5個外掛的目標,和分析的一樣。
再來看一個跳過測試的例子,如下:
D:\code\IdeaProjects\maven-chat06>mvn test -Dmaven.skip.test=true
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
[INFO] Building maven-chat06 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.384 s
[INFO] Finished at: 2019-11-18T16:38:52+08:00
[INFO] ------------------------------------------------------------------------
上面這個是不是很熟悉,經常用到的跳過測試,為什麼這麼寫,我想大家都知道了吧。
其他幾個mvn compile
、mvn install
、mvn deploy
建議大家也自己去玩玩,加深理解。
自定義繫結
除了預設繫結的一些操作,我們自己也可以將一些階段繫結到指定的外掛目標上來完成一些操作,這種自定義繫結讓maven專案在構件的過程中可以執行更多更豐富的操作。
常見的一個案例是:建立專案的原始碼jar包,將其安裝到倉庫中,內建外掛繫結關係中沒有涉及到這一步的任務,所以需要使用者自己配置。
外掛maven-source-plugin
的jar-no-fork
可以幫助我們完成該任務,我們將這個目標繫結在default
生命週期的verify
階段上面,這個階段沒有任何預設繫結,verify
是在測試完成之後並將構件安裝到本地倉庫之前執行的階段,在這個階段我們生成原始碼,配置如下:
在maven-chat06
中的pom.xml
加入如下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!-- 使用外掛需要執行的任務 -->
<execution>
<!-- 任務id -->
<id>attach-source</id>
<!-- 任務中外掛的目標,可以指定多個 -->
<goals>
<goal>jar-no-fork</goal>
</goals>
<!-- 繫結的階段 -->
<phase>verify</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
注意上面配置的
attach-source
,後面輸出中會有。id:任務的id,需唯一,如果不指定,預設為
default
。每個外掛的配置在pom.xml的
plugins
元素中只能寫一次,否則會有警告。
最終pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<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.javacode2018</groupId>
<artifactId>maven-chat06</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置maven編譯的時候採用的編譯器版本 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<!-- 指定原始碼是什麼版本的,如果原始碼和這個版本不符將報錯,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-source引數 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 該命令用於指定生成的class檔案將保證和哪個版本的虛擬機器進行相容,maven中執行編譯的時候會用到這個配置,預設是1.5,這個相當於javac命令後面的-target引數 -->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!-- 使用外掛需要執行的任務 -->
<execution>
<!-- 任務id -->
<id>attach-source</id>
<!-- 任務中外掛的目標,可以指定多個 -->
<goals>
<goal>jar-no-fork</goal>
</goals>
<!-- 繫結的階段 -->
<phase>verify</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
執行下面命令:
mvn install
效果:
D:\code\IdeaProject