1. 程式人生 > 程式設計 >Maven外掛的安裝及使用

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: x x x 這 樣 的 部 分 , 這 種 表 示 給 這 個 運 行 的 目 標 傳 參 , 可 以 通 過 m v n − D x x x 這 種 方 式 傳 參 , x x x 為 {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
[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] ------------------------------------------------------------------------

大家認真看一下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

該命令呼叫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如下:

<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>

執行下面命令:

mvn install

效果:

D:\code\IdeaProjects\maven-chat06>mvn install
[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]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat06 ---
[INFO]
[INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ maven-chat06 ---
[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] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT-sources.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.268 s
[INFO] Finished at: 2019-11-18T16:59:12+08:00
[INFO] ------------------------------------------------------------------------

上面有個輸出如下:

maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ maven-chat06 ---

可以看出呼叫了我們配置的外掛生成原始碼jar,上面的括號中的attach-source就是pom.xml中配置的任務id。

最後有個輸出:

[INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT-sources.jar

可以看到將原始碼安裝到本地倉庫了。

有些外掛的目標預設會繫結到一些生命週期的階段中,那麼如果剛好外掛預設繫結的階段和上面配置的一致,那麼上面phase元素可以不寫了,那麼怎麼檢視外掛的預設繫結呢?

mvn help:describe -Dplugin=外掛goupId:外掛artifactId[:外掛version] -Dgoal=目標名稱 -Ddetail
mvn help:describe -Dplugin=外掛字首 -Dgoal=目標名稱 -Ddetail

我們看一下外掛source的jar-no-fork目標預設的繫結:

D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=source -Dgoal=jar-no-fork -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: 'source:jar-no-fork'
source:jar-no-fork
 Description: This goal bundles all the sources into a jar archive. This
  goal functions the same as the jar goal but does not fork the build and is
  suitable for attaching to the build lifecycle.
 Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo
 Language: java
 Bound to phase: package

上面輸出中有個Bound to phase: package,表示預設繫結在了package階段上。

我們知道3套生命週期的執行時沒有依賴的,但是每套中的階段是有先後順序的,執行某個階段的時候,會先執行他前面所有的階段。清理程式碼使用的是clean週期中的clean階段,編譯程式碼用的是default週期中的compile階段,當直接執行mvn compile編譯程式碼的時候並不會去清理程式碼,編譯程式碼的時候若發現檔案沒有變動,會跳過沒有變化的檔案進行編譯。如果我們想每次編譯之前強制先清理程式碼,我們經常這麼寫:

mvn clean compile

上面的寫法是不是很熟悉,執行一下看看效果:

D:\code\IdeaProjects\maven-chat06>mvn clean compile
[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] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.666 s
[INFO] Finished at: 2019-11-18T17:16:53+08:00
[INFO] ------------------------------------------------------------------------

還有其他方式麼?

我們剛才學了自定義繫結,我們可以在default生命週期的第一個階段validate繫結清理程式碼的外掛,那我們來通過自定義繫結來實現一下,project->build->plugins元素中加入下面配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-clean-plugin</artifactId>
  <version>2.5</version>
  <executions>
    <!-- 使用外掛需要執行的任務 -->
    <execution>
      <!-- 任務中外掛的目標,可以指定多個 -->
      <id>clean-target</id>
      <goals>
        <goal>clean</goal>
      </goals>
      <!-- 繫結的階段 -->
      <phase>validate</phase>
    </execution>
  </executions>
</plugin>

執行下面命令看效果:

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-clean-plugin:2.5:clean (clean-target) @ 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] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.630 s
[INFO] Finished at: 2019-11-18T17:22:37+08:00
[INFO] ------------------------------------------------------------------------

輸出中有:

[INFO] --- maven-clean-plugin:2.5:clean (clean-target) @ maven-chat06 ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat06\target

這個表示運行了程式碼清理的功能,進行了程式碼清理,是不是感覺很爽,不用每次都寫clean了。

POM.xml外掛配置詳解

外掛目標共享引數配置

build->plugins->plugin中配置:

<!-- 外掛引數配置,對外掛中所有的目標起效 -->
<configuration>
  <目標引數名>引數值</目標引數名>
</configuration>

configuration節點下配置目標引數的值,節點名稱為目標的引數名稱,上面這種配置對當前外掛的所有目標起效,也就是說這個外掛中所有的目標共享此引數配置。

案例:
將案例中的pom.xml中的build元素修改成下面這樣。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12.4</version>
      <!-- 外掛引數配置,對外掛中所有的目標起效 -->
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

執行下面命令,看效果:

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] 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.328 s
[INFO] Finished at: 2019-11-18T17:30:58+08:00
[INFO] ------------------------------------------------------------------------

可以看到Test are skipped,說明跳過了測試,到此為止,跳過測試已經講了3種了:

1. mvn -Dmaven.test.skip=tue
2. properties中配置<maven.test.skip>true</maven.test.skip>
3. build中配置外掛引數的方式

上面這個配置引數方式對當前外掛的所有目標有效,如果想對指定的目標進行配置呢,用下面的方式。

外掛目標引數配置

project->build->plugins->plugin->executions->execution元素中進行配置,如下:

<!-- 這個地方配置只對當前任務有效 -->
<configuration>
  <目標引數名>引數值</目標引數名>
</configuration>

上面這種配置常用於自定義外掛繫結,只對當前任務有效。

感受一下效果,將pom.xml中的build元素改為下面內容:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12.4</version>
      <executions>
        <execution>
          <goals>
            <goal>test</goal>
            <goal>help</goal>
          </goals>
          <phase>pre-clean</phase>
          <!-- 這個地方配置只對當前任務有效 -->
          <configuration>
            <skip>true</skip>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

上面自定義了一個繫結,在clean週期的pre-clean階段綁定了外掛maven-surefire-plugin的兩個目標test和help,execution元素沒有指定id,所以預設id是default。

執行下面命令,見效果:

D:\code\IdeaProjects\maven-chat06>mvn pre-clean
[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) @ maven-chat06 ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:help (default) @ 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.738 s
[INFO] Finished at: 2019-11-18T17:41:08+08:00
[INFO] ------------------------------------------------------------------------

可以看到上面輸出中運行了外掛的兩個目標,和預期結果一致。

獲取maven外掛資訊

上面我們介紹了,可以通過下面命令獲取外掛詳細介紹資訊

mvn help:describe -Dplugin=外掛goupId:外掛artifactId[:外掛version] -Dgoal=目標名稱 -Ddetail
mvn help:describe -Dplugin=外掛字首 -Dgoal=目標名稱 -Ddetail

更多maven外掛的幫助文件可以參考maven的官方網站,上面有詳細的介紹,建議大家去看看,地址:http://maven.apache.org/plugins/

在這裡插入圖片描述

外掛解析機制

為了方便使用者使用和配置外掛,maven不需要使用者提供完整的外掛座標資訊,就可以解析到正確的外掛,不過我建議使用外掛配置的時候最好還是配置完整的座標資訊,不然不利於新人的理解和問題的排查。

外掛倉庫

與其他maven構件一樣,外掛構件也是基於座標儲存在maven倉庫中,有需要的時候,maven會從本地查詢外掛,如果不存在,則到遠端倉庫查詢,找到了以後下載到本地倉庫,然後使用。

大家回憶一下,上一章講過的,pom.xml中可以配置依賴的構件的倉庫地址,如下:

<repositories>
  <repository>
    <id>maven-nexus</id>
    <url>http://localhost:8081/repository/maven-public/</url>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
  </repository>
</repositories>

但是外掛倉庫的配置和這個有一點不一樣,外掛的是在pluginRepositories->pluginRepository元素中配置的,如下:

<pluginRepositories>
  <pluginRepository>
    <id>myplugin-repository</id>
    <url>http://repo1.maven.org/maven2/</url>
    <releases>
      <enabled>true</enabled>
    </releases>
  </pluginRepository>
</pluginRepositories>

看一下上面2段配置,repository中的配置和pluginRepository中的子元素是一樣的,這個主意下就可以了。

外掛的預設groupId

在pom.xml中配置外掛的時候,如果是官方的外掛,可以省略groupId。

案例:

修改本篇示例中的pom.xml,如下:

<pluginRepositories>
  <pluginRepository>
    <id>myplugin-repository</id>
    <url>http://repo1.maven.org/maven2/</url>
    <releases>
      <enabled>true</enabled>
    </releases>
  </pluginRepository>
</pluginRepositories>

上面用到了maven-compiler-plugin,這個外掛是編譯程式碼的,是maven官方提供的外掛,我們省略了groupId。

上面這個外掛用於編譯程式碼的,編譯程式碼的時候需要指定編譯器的版本,原始碼的版本,目的碼的版本,都是用的是1.8。

大家回頭去看一下,文章最開始的時候,在properties中有幾個屬性值是1.8的配置,這幾個值預設會被maven-compiler-plugin這個外掛的上面3個引數獲取,具體可以去看一下這個外掛compile目標的引數說明。

執行下面命令:

D:\code\IdeaProjects\maven-chat06>mvn clean compile
[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] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.692 s
[INFO] Finished at: 2019-11-18T18:11:34+08:00
[INFO] ------------------------------------------------------------------------

可以看到可以正常執行。

上面pom.xml省略了外掛的groupId配置,如下:

<groupId>org.apache.maven.plugins</groupId>

maven在解析該外掛的時候,會自動給這個外掛補上預設的官方的groupId,所以可以正常執行,但是不建議大家這麼使用,容易讓新手比較懵逼。

外掛字首的解析

前面說過了使用mvn命令呼叫外掛的時候,可以使用外掛的字首來代替繁瑣的外掛座標的方式,那麼maven是如何根據外掛的字首找到對應的外掛的呢?

外掛字首與外掛groupId:artifactId是一一對應的關係,這個關係的配置儲存在倉庫的元資料中,元資料位於下面2個xml中:

~/.m2/repository/org/apache/maven/plugins/maven-metadata-central.xml
~/.m2/repository/org/codehaus/mojo/maven-metadata-central.xml

接幾個圖,大家感受一下:

在這裡插入圖片描述

也可以通過在settings.xml中配置,讓maven檢查其他grouId上的外掛元資料中字首和外掛關係的配置,如下:

<settings>
 <pluginGroups>
  <pluginGroup>com.your.plugins</pluginGroup>
 </pluginGroups>
</settings>

pluginGroups中有多個pluginGroup,可以配置你自己外掛的元資料所在的groupId,然後可以通過字首來訪問你自己的外掛元資料目錄,此處先不細說,這個後面文章中講自定義外掛的時候會再次說明。

檢視專案最終pom.xml檔案

我們的pom.xml預設會繼承maven頂級的一個父類pom.xml,頂級的pom.xml中指定了很多預設的配置,如生命週期中的階段和很多外掛的繫結,這些如果我們想看到,到哪裡看呢?

mvn命令在專案中執行的時候,我們的pom.xml和父類的pom.xml最終會進行合併,當我們的pom.xml寫的比較複雜的時候,最終合併之後是什麼效果呢,我們可以通過下面這個命令檢視:

mvn help:effective-pom

效果:

D:\code\IdeaProjects\maven-chat06>mvn help:effective-pom > 1.xml

上面我們將命令產生的結果輸出到專案的1.xml檔案中了,我們看一下專案的1.xml的內容:

<?xml version="1.0" encoding="GBK"?>
<!-- ====================================================================== -->
<!--                                    -->
<!-- Generated by Maven Help Plugin on 2019-11-18T18:41:40+08:00      -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/        -->
<!--                                    -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!--                                    -->
<!-- Effective POM for project                       -->
<!-- 'com.javacode2018:maven-chat06:jar:1.0-SNAPSHOT'            -->
<!--                                    -->
<!-- ====================================================================== -->
<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>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <sourceDirectory>D:\code\IdeaProjects\maven-chat06\src\main\java</sourceDirectory>
    <scriptSourceDirectory>D:\code\IdeaProjects\maven-chat06\src\main\scripts</scriptSourceDirectory>
    <testSourceDirectory>D:\code\IdeaProjects\maven-chat06\src\test\java</testSourceDirectory>
    <outputDirectory>D:\code\IdeaProjects\maven-chat06\target\classes</outputDirectory>
    <testOutputDirectory>D:\code\IdeaProjects\maven-chat06\target\test-classes</testOutputDirectory>
    <resources>
      <resource>
        <directory>D:\code\IdeaProjects\maven-chat06\src\main\resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>D:\code\IdeaProjects\maven-chat06\src\test\resources</directory>
      </testResource>
    </testResources>
    <directory>D:\code\IdeaProjects\maven-chat06\target</directory>
    <finalName>maven-chat06-1.0-SNAPSHOT</finalName>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <compilerVersion>1.8</compilerVersion>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </execution>
          <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <compilerVersion>1.8</compilerVersion>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <compilerVersion>1.8</compilerVersion>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>2.5</version>
        <executions>
          <execution>
            <id>default-clean</id>
            <phase>clean</phase>
            <goals>
              <goal>clean</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <id>default-testResources</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testResources</goal>
            </goals>
          </execution>
          <execution>
            <id>default-resources</id>
            <phase>process-resources</phase>
            <goals>
              <goal>resources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <executions>
          <execution>
            <id>default-test</id>
            <phase>test</phase>
            <goals>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>default-install</id>
            <phase>install</phase>
            <goals>
              <goal>install</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>default-deploy</id>
            <phase>deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.3</version>
        <executions>
          <execution>
            <id>default-site</id>
            <phase>site</phase>
            <goals>
              <goal>site</goal>
            </goals>
            <configuration>
              <outputDirectory>D:\code\IdeaProjects\maven-chat06\target\site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
          <execution>
            <id>default-deploy</id>
            <phase>site-deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
            <configuration>
              <outputDirectory>D:\code\IdeaProjects\maven-chat06\target\site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <outputDirectory>D:\code\IdeaProjects\maven-chat06\target\site</outputDirectory>
          <reportPlugins>
            <reportPlugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-project-info-reports-plugin</artifactId>
            </reportPlugin>
          </reportPlugins>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <outputDirectory>D:\code\IdeaProjects\maven-chat06\target\site</outputDirectory>
  </reporting>
</project>

上面這個檔案,大家一定要認真多看幾遍,理解一下,裡面包含太多東西,再重複一下,上面的檔案多看幾遍!多看幾遍!多看幾遍!要理解!

到此這篇關於Maven外掛的安裝及使用的文章就介紹到這了,更多相關Maven外掛內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!