13161216443

您所在位置: 首頁> 學習課程> java培訓 | Maven系列:聚合、繼承、單繼承問題詳解!

java培訓 | Maven系列:聚合、繼承、單繼承問題詳解!

發布百知教育 來源:學習課程 2019-11-21

maven系列目標:從入門開始開始掌握一個高級開發所需要的maven技能。

這是maven系列第7篇。

本篇內容

  1. maven中聚合詳解

  2. maven中繼承詳解

  3. pom.xml中parent元素的使用詳解

  4. pom.xml中dependencyManagement元素使用詳解

  5. pom.xml中pluginManagement元素使用詳解

  6. 單繼承存在的問題及解決方案詳解(springboot,springcloud中會常用)

  7. 解答上一篇遺留的2個問題

聚合

原始需求

我們需要使用java做一個電商網站,涉及到:pc端網站、h5微站、移動端接口部分,那么我們可以使用maven創建3個項目用于這3塊業務的開發,3個項目名稱如下:

javacode2018-pc
javacode2018-h5
javacode2018-api

這3個項目的groupId都是com.javacode2018,artifactId取上面的,我們使用maven來搭建項目結構。

實現

創建第一個javacode2018-pc項目

打開idea,點擊File->New->Project,選擇Maven,如下:

java培訓班

點擊Next,輸入項目坐標信息,如下:



java培訓班



點擊Next,輸入Project name 為javacode2018-pc,如下:



java培訓班


點擊Finish,創建成功,如下:



java培訓班



配置一下idea的maven環境,點擊File->Settings,如下圖:


java培訓

點擊上面的OK完成配置。

大家再按照上面一樣的操作,分別創建另外2個項目javacode2018-h5javacode2018-api,創建完成之后,另外2個項目如下圖:


10.png

java培訓班


上面3個項目由整個項目組6個人共同開發,這幾個項目經常一起上線,上線過程,先由開發進行打包,然后將幾個包發給運行進行發布。我們使用mvn package進行打包,需要在每個項目的pom.xml所在目錄都去執行一次這個命令,也就是說需要執行3次,這個電商項目還會涉及到后臺系統、bi系統、監控系統等等,可能最后會多達10個小項目,那時候我們每次上線都需要執行10次打包操作,這個過程是相當繁瑣的。

那么maven有沒有更好的辦法來解決這個事情呢?

這個用到的就是我們本次要說的maven中的聚合。

整個電商我們可以作為一個大的系統,上面的pc端、h5微站、api接口、后臺系統、bi系統、監控系統都可以作為里面的一個具體比較大一個模塊。

我們使用maven聚合功能來實現上面的需求,我們需要創建一個額外的maven項目javacode-aggregator來管理上面3個項目,然后只用在javacode-aggregator項目中執行mvn命令,就會自動為其他3個項目自動執行同樣的mvn命令。

Maven聚合

maven聚合需要創建一個新的maven項目, 用來管理其他的maven構件模塊,新的maven項目中加入如下配置:

<modules>
    <module>模塊1</module>
    <module>模塊2</module>
    <module>模塊n</module>
</modules>
<package>pom</package>

新的項目中執行任何mvn命令,都會modules中包含的所有模塊執行同樣的命令,而被包含的模塊不需要做任何特殊的配置,正常的maven項目就行。

注意上面的module元素,這部分是被聚合的模塊pom.xml所在目錄的相對路徑。

package的值必須為pom,這個需要注意。

下面看案例。

實操案例

下面過程仔細看了。

創建項目`javacode-aggregator`

打開idea,點擊File->New->Project,選擇Maven,如下:


java培訓班

點擊Next,輸入項目坐標信息,如下:


13.png


點擊Next,輸入Project name 為javacode-aggregator,如下:



java培訓班


點擊Finish,創建成功,配置一下idea的maven環境,點擊File->Settings


刪除下面無用的代碼:



15.png


項目變成了下面這樣:



java培訓班


pom.xml中加入下面配置:

<packaging>pom</packaging>

最后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>javacode-aggregator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

</project>
創建`javacode2018-pc` 模塊

注意這里說的是模塊,不再是創建項目,過程仔細看。

idea中選中javacode-aggregator

點擊File->New->Module,準備創建模塊,如下圖:



java培訓班


選擇Maven


點擊Next,


點擊下面的...按鈕,選擇None


輸入坐標信息,如下:



java培訓班


點擊Next,輸入Module name :javacode2018-pc,如下:



22.png



點擊Finish,完成javacode-2018模塊的創建,如下:



java培訓班


我們來看一下javacode-aggregator的pom.xml,多了一部分,如下:



java培訓班



注意上面的<packaging>pom</packaging>

創建javacode2018-h5模塊

創建步驟和上面javacode2018-pc步驟一樣。

創建javacode2018-api模塊

創建步驟和上面javacode2018-pc步驟一樣。

我們看一下項目最終結構,如下圖:



java培訓班



看一下上圖中的javacode-aggregator項目的pom.xml,modules元素中多出了3部分。

再來看看其他3個模塊的pom文件,和普通的pom.xml一樣,如下圖:

java培訓

java培訓

java培訓班




javacode-aggregator/pom.xml目錄中執行mvn package感受一下效果:

D:\code\IdeaProjects\javacode-aggregator>mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-pc                                                    [jar]
[INFO] javacode2018-h5                                                    [jar]
[INFO] javacode2018-api                                                   [jar]
[INFO] javacode-aggregator                                                [pom]
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT                              [1/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-h5 >------------------
[INFO] Building javacode2018-h5 1.0-SNAPSHOT                              [2/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-h5\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-h5 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-h5 ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-h5\target\javacode2018-h5-1.0-SNAPSHOT.jar
[INFO]
[INFO] -----------------< com.javacode2018:javacode2018-api >------------------
[INFO] Building javacode2018-api 1.0-SNAPSHOT                             [3/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode-aggregator\javacode2018-api\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-api ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-api ---
[INFO] Building jar: D:\code\IdeaProjects\javacode-aggregator\javacode2018-api\target\javacode2018-api-1.0-SNAPSHOT.jar
[INFO]
[INFO] ----------------< com.javacode2018:javacode-aggregator >----------------
[INFO] Building javacode-aggregator 1.0-SNAPSHOT                          [4/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for javacode-aggregator 1.0-SNAPSHOT:
[INFO]
[INFO] javacode2018-pc .................................... SUCCESS [  2.542 s]
[INFO] javacode2018-h5 .................................... SUCCESS [  0.195 s]
[INFO] javacode2018-api ................................... SUCCESS [  0.218 s]
[INFO] javacode-aggregator ................................ SUCCESS [  0.024 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.223 s
[INFO] Finished at: 2019-11-19T13:28:00+08:00
[INFO] ------------------------------------------------------------------------

我們分析一下上面的輸出:

[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-pc                                                    [jar]
[INFO] javacode2018-h5                                                    [jar]
[INFO] javacode2018-api                                                   [jar]
[INFO] javacode-aggregator                                                [pom]

上面這個列出了需要構件的maven構件列表及順序,共有4個構件,3個jar包,1個pom類型的構件。

然后開始按照上面列出的順序,一個個開始執行mvn package命令,最后4個都執行成功了,我們來看一下最終產生的效果,如下圖:



java培訓班




從上圖中我們可以看到3個模塊都生成了jar包,說明我們執行了一次mvn package,分別在3個模塊中都運行了,我們在來執行一下mvn clean清理代碼,感受一下最終效果:

D:\code\IdeaProjects\javacode-aggregator>mvn clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-pc                                                    [jar]
[INFO] javacode2018-h5                                                    [jar]
[INFO] javacode2018-api                                                   [jar]
[INFO] javacode-aggregator                                                [pom]
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT                              [1/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-pc ---
[INFO] Deleting D:\code\IdeaProjects\javacode-aggregator\javacode2018-pc\target
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-h5 >------------------
[INFO] Building javacode2018-h5 1.0-SNAPSHOT                              [2/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-h5 ---
[INFO] Deleting D:\code\IdeaProjects\javacode-aggregator\javacode2018-h5\target
[INFO]
[INFO] -----------------< com.javacode2018:javacode2018-api >------------------
[INFO] Building javacode2018-api 1.0-SNAPSHOT                             [3/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-api ---
[INFO] Deleting D:\code\IdeaProjects\javacode-aggregator\javacode2018-api\target
[INFO]
[INFO] ----------------< com.javacode2018:javacode-aggregator >----------------
[INFO] Building javacode-aggregator 1.0-SNAPSHOT                          [4/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode-aggregator ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for javacode-aggregator 1.0-SNAPSHOT:
[INFO]
[INFO] javacode2018-pc .................................... SUCCESS [  0.250 s]
[INFO] javacode2018-h5 .................................... SUCCESS [  0.067 s]
[INFO] javacode2018-api ................................... SUCCESS [  0.068 s]
[INFO] javacode-aggregator ................................ SUCCESS [  0.034 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.605 s
[INFO] Finished at: 2019-11-19T13:34:42+08:00
[INFO] ------------------------------------------------------------------------

項目結構如下圖:



java培訓班



3個項目中的target都被清理掉了,是不是感覺很爽。

上面介紹了pom.xml中的module元素的值為被聚合的模塊pom.xml所在的目錄路徑,可以是相對路徑,也可以是絕對路徑,上面演示的是相對路徑,大家可以自己去玩一下絕對路徑的情況。

聚合的功能中,聚合模塊的pom.xml中通過modules->module來引用被聚合的模塊,被聚合的模塊是不用感知自己被聚合了,所以被聚合的模塊中pom.xml中是不知道javacode-aggregator的存在的。

繼承

需求

細心的朋友已經發現了javacode2018-pc、javacode2018-h5、javacode2018-api3個項目的groupId、version都是一樣的。還有這幾個項目準備都是用springmvc、mybatis開發的,所以需要引入依賴如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.3</version>
</dependency>

3個項目中出現了同樣的配置,一個配置出現了多份,作為開發者,我想你們和我一樣,是無法接受的,必須要尋求一些方法來解決,需要將公共的部分提取出來共用。

maven也為我們考慮到了這種情況,maven中使用繼承來解決這個問題。

繼承的實現

操作分為3步驟:

  1. 創建一個父maven構件,將依賴信息放在pom.xml中

    <dependencies>
       <dependency>依賴的構件的坐標信息</dependency>
       <dependency>依賴的構件的坐標信息</dependency>
       <dependency>依賴的構件的坐標信息</dependency>
    </dependencies>
  2. 將父構件的package元素的值置為pom

    <packaging>pom</packaging>
  3. 在子構件的pom.xml引入父構件的配置:

    <parent>
       <groupId>父構件groupId</groupId>
       <artifactId>父構件artifactId</artifactId>
       <version>父構件的版本號</version>
       <relativePath>父構件pom.xml路徑</relativePath>
    </parent>

relativePath表示父構件pom.xml相對路徑,默認是../pom.xml,所以一般情況下父子結構的maven構件在目錄結構上一般也采用父子關系。

實操案例

先創建一個父項目javacode-parent,坐標信息如下:

<groupId>com.javacode2018</groupId>
<artifactId>javacode2018-parent</artifactId>
<version>1.0-SNAPSHOT</version>

創建過程大家已經輕車熟路了,就不演示了,最終如下圖:



java培訓班


刪除無用的2目錄.idea和src


java培訓班

創建子模塊`javacode2018-pc` 模塊

注意這里說的是模塊了,不在是創建項目了,過程仔細看。

idea中選中javacode-parent,點擊File->New->Module,準備創建模塊,選中Maven


點擊Next,這個頁面需要注意了,默認如下圖

java培訓班


此時我們點擊第一個...按鈕,這個按鈕是設置聚合的,所以選中None


輸入構件信息,如下圖


java培訓班


點擊Next,輸入Module-name的值為javacode2018-pc



java培訓班


點擊Finish完成創建操作



上圖中,看一下javacode2018-pc的pom.xml,多了個parent元素,并且這個pom.xml中構件的groupId、version都沒有了,這個pom.xml繼承了javacode2018-parent/pom.xml中的內容,他們的groupId、version都是一樣的,子構件可以從父pom.xml中繼承這些內容,所以如果是一樣的情況,可以不寫。

創建另外兩個子模塊javacode2018-h5、javacode2018-api

步驟參考javacode2018-pc模塊的創建過程。

最終項目如下圖:



java培訓班


下面我們來看一下4個pom.xml的內容。

javacode2018-parent/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>javacode2018-parent</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

javacode2018-pc/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">

    <parent>
        <artifactId>javacode2018-parent</artifactId>
        <groupId>com.javacode2018</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>javacode2018-pc</artifactId>

</project>

javacode2018-h5/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">

    <parent>
        <artifactId>javacode2018-parent</artifactId>
        <groupId>com.javacode2018</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>javacode2018-h5</artifactId>

</project>

javacode2018-api/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">

    <parent>
        <artifactId>javacode2018-parent</artifactId>
        <groupId>com.javacode2018</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>javacode2018-api</artifactId>

</project>

我們在父構件javacode2018-parent/pom.xml中加入下面配置:

<packaging>pom</packaging>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.3</version>
    </dependency>
</dependencies>

使用下面命令在javacode2018-parent/pom.xml所在目錄看一下javacode2018-parent構件依賴情況:

D:\code\IdeaProjects\javacode2018-parent>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.javacode2018:javacode2018-parent >-----------------
[INFO] Building javacode2018-parent 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-parent ---
[INFO] com.javacode2018:javacode2018-parent:pom:1.0-SNAPSHOT
[INFO] +- org.springframework:spring-web:jar:5.2.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:5.2.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:5.2.1.RELEASE:compile
[INFO] |     \- org.springframework:spring-jcl:jar:5.2.1.RELEASE:compile
[INFO] \- org.mybatis:mybatis-spring:jar:2.0.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.544 s
[INFO] Finished at: 2019-11-19T14:58:21+08:00
[INFO] ------------------------------------------------------------------------

mvn dependency:tree 這個插件可以根據pom.xml的配置,列出構件的依賴樹信息。

我們再來看看javacode2018-pc/pom.xml構件的依賴信息:

D:\code\IdeaProjects\javacode2018-parent>cd javacode2018-pc

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-pc ---
[INFO] com.javacode2018:javacode2018-pc:jar:1.0-SNAPSHOT
[INFO] +- org.springframework:spring-web:jar:5.2.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:5.2.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:5.2.1.RELEASE:compile
[INFO] |     \- org.springframework:spring-jcl:jar:5.2.1.RELEASE:compile
[INFO] \- org.mybatis:mybatis-spring:jar:2.0.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.093 s
[INFO] Finished at: 2019-11-19T14:59:34+08:00
[INFO] ------------------------------------------------------------------------

從上圖中可以看到javacode2018-pc依賴的jar和父構件javacode2019-parent的一樣,說明從父類繼承了這些依賴。

其他2個子構件,大家也可以去看一下,依賴關系都從父構件繼承過來了。

relativePath元素

上面演示的父構件和子構件的目錄結構剛好符合父子關系,如果父構件和子構件的目錄不是父子關系,比如都位于同等級別的目錄或者位于更復雜的目錄的時候,此時我們需要在子pom.xmlparent元素中使用relativePath元素來指定父pom.xml相對路徑位置,這個值我們上面沒有指定,默認是../pom.xml,表示父pom.xml位于子pom.xml的上一級目錄,我們的模塊剛好符合這種關系,所以這個值省略了。

正確的設置relativePath是非常重要的,這個需要注意,子模塊中執行mvn命令的時候,會去找父pom.xml的配置,會先通過relativePath指定的路徑去找,如果找不到,會嘗試通過坐標在本地倉庫進行查找,如果本地找不到,會去遠程倉庫找,如果遠程倉庫也沒有,會報錯。

可以通過繼承的元素有以下這些

上面我們看到了groupId、version、dependency中的依賴在子pom.xml中都沒有寫,這些都是從父pom.xml中繼承過來的,還有很多元素也可以被繼承過來,下面我們列個清單:

  • groupId:項目組ID,項目坐標的核心元素

  • version:項目版本,項目坐標的核心元素

  • description:項目的描述信息

  • organization:項目的組織信息

  • inceptionYear:項目的創始年份

  • url:項目的url地址

  • developers:項目的開發者信息

  • contributors:項目的貢獻者信息

  • distributionManagement:項目的部署配置信息

  • issueManagement:項目的缺陷跟蹤系統信息

  • ciManagement:項目的持續集成系統信息

  • scm:項目的版本控制系統信息

  • mailingLists:項目的郵件列表信息

  • properties:自定義的maven屬性配置信息

  • dependencyManagement:項目的依賴管理配置

  • repositories:項目的倉庫配置

  • build:包括項目的源碼目錄配置、輸出目錄配置、插件管理配置等信息

  • reporting:包括項目的報告輸出目錄配置、報告插件配置等信息

依賴管理(dependencyManagement)

大家是否發現了,上面的繼承存在的一個問題,如果我在新增一個子構件,都會默認從父構件中繼承依賴的一批構建,父pom.xml中配置的這些依賴的構建可能是其他項目不需要的,可能某個子項目只是想使用其中一個構件,但是上面的繼承關系卻把所有的依賴都給傳遞到子構件中了,這種顯然是不合適的。

maven中也考慮到了這種情況,可以使用dependencyManagement元素來解決這個問題。

maven提供的dependencyManagement元素既能讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性,在dependencyManagement元素下聲明的依賴不會引入實際的依賴,他只是聲明了這些依賴,不過它可以對dependencies中使用的依賴起到一些約束作用。

修改javacode2018-parent/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>javacode2018-parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.2.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

可以看到我們將dependencies配置移到dependencyManagement下面了。

我們使用下面命令看一下項目的依賴情況:

D:\code\IdeaProjects\javacode2018-parent>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.javacode2018:javacode2018-parent >-----------------
[INFO] Building javacode2018-parent 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-parent ---
[INFO] com.javacode2018:javacode2018-parent:pom:1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.756 s
[INFO] Finished at: 2019-11-19T15:44:52+08:00
[INFO] ------------------------------------------------------------------------

D:\code\IdeaProjects\javacode2018-parent>cd javacode2018-pc

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-pc ---
[INFO] com.javacode2018:javacode2018-pc:jar:1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.676 s
[INFO] Finished at: 2019-11-19T15:45:08+08:00
[INFO] ------------------------------------------------------------------------

父子構件中都看不到依賴的jar包了,說明父pom.xml中dependencyManagement這些依賴的構建沒有被子模塊依賴進去。

子模塊如果想用到這些配置,可以dependencies進行引用,引用之后,依賴才會真正的起效。

在在3個子模塊的pom.xml中加入下面配置:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
    </dependency>
</dependencies>

我們在運行一下上面的3個命令,看效果:

D:\code\IdeaProjects\javacode2018-parent>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.javacode2018:javacode2018-parent >-----------------
[INFO] Building javacode2018-parent 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-parent ---
[INFO] com.javacode2018:javacode2018-parent:pom:1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.759 s
[INFO] Finished at: 2019-11-19T15:48:28+08:00
[INFO] ------------------------------------------------------------------------

D:\code\IdeaProjects\javacode2018-parent>cd javacode2018-pc

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ javacode2018-pc ---
[INFO] com.javacode2018:javacode2018-pc:jar:1.0-SNAPSHOT
[INFO] +- org.springframework:spring-web:jar:5.2.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:5.2.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:5.2.1.RELEASE:compile
[INFO] |     \- org.springframework:spring-jcl:jar:5.2.1.RELEASE:compile
[INFO] \- org.mybatis:mybatis-spring:jar:2.0.3:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.875 s
[INFO] Finished at: 2019-11-19T15:48:38+08:00
[INFO] ------------------------------------------------------------------------

javacode2018-parent構件中沒有列出依賴信息,而javacode2018-pc列出了依賴信息。

大家看一下下面的截圖:


java培訓班



注意上面的紅框中依賴的構建沒有version,左邊2個紅圈中的2個向上的箭頭,表示這個是從父pom.xml中傳遞過來的,所以version可以省略。

再看一下父pom.xml截圖效果:


java培訓班



dependencyManagement中定義了依賴的構建,2個向下的箭頭表示被子模塊有繼承。

dependencyManagement不會引入實際的依賴,只有在子類中使用dependency來引入父dependencyManagement聲明的依賴之后,依賴的構建才會被真正的引入。

使用dependencyManagement來解決繼承的問題,子pom.xml中只用寫groupId,artifactId就可以了,其他信息都會從父dependencyManagement中聲明的依賴關系中傳遞過來,通常我們使用這種方式將所有依賴的構建在父pom.xml中定義好,子構件中只需要通過groupId,artifactId就可以引入依賴的構建,而不需要寫version,可以很好的確保多個子項目中依賴構件的版本的一致性,對應依賴構件版本的升級也非常方便,只需要在父pom.xml中修改一下就可以了。

單繼承問題

存在的問題及解決方案

上面講解了dependencyManagement的使用,但是有個問題,只有使用繼承的時候,dependencyManagement中聲明的依賴才可能被子pom.xml用到,如果我的項目本來就有父pom.xml了,但是我現在想使用另外一個項目dependencyManagement中聲明的依賴,此時我們怎么辦?這就是單繼承的問題,這種情況在spring-boot、spring-cloud中會遇到,所以大家需要注意,這塊一定需要玩轉。

當我們想在項目中使用另外一個構件中dependencyManagement聲明的依賴,而又不想繼承這個項目的時候,可以在我們的項目中使用加入下面配置:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.javacode2018</groupId>
            <artifactId>javacode2018-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>構件2</dependency>
        <dependency>構件3</dependency>
        <dependency>構件n</dependency>
    </dependencies>
</dependencyManagement>

上面這個配置會將javacode2018-parent構件中dependencyManagement元素中聲明的所有依賴導入到當前pom.xml的dependencyManagement中,相當于把下面部分的內容:

<dependency>
    <groupId>com.javacode2018</groupId>
    <artifactId>javacode2018-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

替換成了javacode2018-parent/pom.xml中dependencyManagement元素內容,替換之后變成:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>
        <dependency>構件2</dependency>
        <dependency>構件3</dependency>
        <dependency>構件n</dependency>
    </dependencies>
</dependencyManagement>

實操案例

創建項目javacode2018-pom-import,具體過程不演示了,坐標信息:

<groupId>com.javacode2018</groupId>
<artifactId>javacode2018-pom-import</artifactId>
<version>1.0-SNAPSHOT</version>

創建完畢之后,如下圖:


java培訓班



修改javacode2018-pom-import/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>javacode2018-pom-import</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.62</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

上面我們在dependencyManagement中聲明了2個依賴:fastjson和junit。

javacode2018-pom-import/pom.xml中執行mvn install將其安裝到本地倉庫

D:\code\IdeaProjects\javacode2018-pom-import>mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] --------------< com.javacode2018:javacode2018-pom-import >--------------
[INFO] Building javacode2018-pom-import 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pom-import ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pom-import ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pom-import ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-pom-import\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pom-import ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pom-import ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pom-import ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-pom-import\target\javacode2018-pom-import-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-pom-import ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-pom-import\target\javacode2018-pom-import-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pom-import\1.0-SNAPSHOT\javacode2018-pom-import-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-pom-import\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pom-import\1.0-SNAPSHOT\javacode2018-pom-import-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.692 s
[INFO] Finished at: 2019-11-19T17:23:16+08:00
[INFO] ------------------------------------------------------------------------

現在我們想在javacode2018-pc/pom.xml中使用javacode2018-pom-import/pom.xmldependencyManagement元素中定義的fastjson和junit的依賴,而我們的javacode2019-pc已經繼承了javacode-parent了,maven中只能單繼承,所以沒法通過繼承的方式來實現了,那么我們可以在javacode2019-pc/pom.xml中加入下面配置:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.javacode2018</groupId>
            <artifactId>javacode2018-pom-import</artifactId>
            <version>1.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

此時可以使用fastjson的依賴了,javacode2018-pc/pom.xmlproject->dependencies元素中加入下面配置:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

看一下效果:


java培訓班


上面的fastjson沒有指定版本號,直接可以使用,說明從javacode2018-pom-import傳遞過來了。

可以點擊一下上面紅圈中的箭頭,會跳到本地倉庫的javacode2018-pom-import-1.0-SNAPSHOT.pom文件,如下:


java培訓班



插件管理(pluginManagement)

maven中提供了dependencyManagement來解決繼承的問題,同樣也提供了解決插件繼承問題的pluginManagement元素,在父pom中可以在這個元素中聲明插件的配置信息,但是子pom.xml中不會引入此插件的配置信息,只有在子pom.xml中使用plugins->plugin元素正在引入這些聲明的插件的時候,插件才會起效,子插件中只需要寫groupId、artifactId,其他信息都可以從父構件中傳遞過來。

實操案例

javacode2018-parent/pom.xml中加入下面配置:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>attach-source</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

maven-source-plugin這個插件在上一章有介紹過,源碼打包的。

上面是將插件maven-source-pluginjar-no-fork目標綁定在default生命周期的verify階段,verify階段會在default生命周期的install周期前面執行。

下面我們看效果。

在javacode2018-pc/pom.xml所在目錄運行下面命令

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-pc ---
[INFO] Deleting D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-pc ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.254 s
[INFO] Finished at: 2019-11-19T16:24:39+08:00
[INFO] ------------------------------------------------------------------------

mvn clean install 會清理代碼,然后將打包構件,將構建安裝到本地倉庫,從輸入中可以看到javacode2018-pc-1.0-SNAPSHOT.jar被安裝到本地倉庫了。

但是沒有看到打包源碼的插件的運行,說明了javacode2018-pc沒有從父pom.xml中繼承插件的配置信息,所以插件配置沒有起效,現在我們要讓插件起效,繼續看:

在javacode2018-pc/pom.xml中加入下面配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
        </plugin>
    </plugins>
</build>

截圖看效果:


java培訓班



又一個線上的箭頭,說明這個是從父pom.xml中傳遞過來了,大家仔細看一下上面的配置,插件只寫了groupId、artifactId,其他信息都沒有寫,其他信息都可以從父pom.xml中傳遞過來,下面我們看一下插件是否起效了,運行下面命令,見證奇跡:

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-pc ---
[INFO] Deleting D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT-sources.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-pc ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.pom
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT-sources.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.477 s
[INFO] Finished at: 2019-11-19T16:28:18+08:00
[INFO] ------------------------------------------------------------------------

注意上面的輸出中有attach-source,這個就是上面我們插件任務的id,輸出中還有javacode2018-pc-1.0-SNAPSHOT-sources.jar信息,說明源碼也是打包成功了,最后也是上傳到了本地倉庫了。

上面演示了只用在子pom.xml中寫上插件的groupId、artifactId就可以了,其他信息會從父pom.xml中插件的定義中傳遞過來,而子pom.xml中也可以自定義插件的這些配置,修改javacode2018-pc/pom.xml配置,如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
                <execution>
                    <id>attach-source</id>
                    <goals>
                        <goal>help</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

再看一下效果:

D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >-------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ javacode2018-pc ---
[INFO] Deleting D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-source-plugin:3.2.0:help (attach-source) @ javacode2018-pc ---
[INFO] Apache Maven Source Plugin 3.2.0
  The Maven Source Plugin creates a JAR archive of the source files of the
  current project.

This plugin has 7 goals:

source:aggregate
  Aggregate sources for all modules in an aggregator project.

source:generated-test-jar
  This plugin bundles all the test sources into a jar archive.

source:help
  Display help information on maven-source-plugin.
  Call mvn source:help -Ddetail
=true -Dgoal=<goal-name> to display parameter
  details.

source:jar
  This plugin bundles all the sources into a jar archive.

source:jar-no-fork
  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.

source:test-jar
  This plugin bundles all the test sources into a jar archive.

source:test-jar-no-fork
  This goal bundles all the test sources into a jar archive. This goal functions
  the same as the test-jar goal but does not fork the build, and is suitable for
  attaching to the build lifecycle.


[INFO]
[INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ javacode2018-pc ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT-sources.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-pc ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.pom
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT-sources.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.752 s
[INFO] Finished at: 2019-11-19T16:41:21+08:00
[INFO] ------------------------------------------------------------------------

輸出中有下面2行:

[INFO] --- maven-source-plugin:3.2.0:help (attach-source) @ javacode2018-pc ---
[INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ javacode2018-pc ---

說明maven-source-plugin插件執行了2個目標:helpjar-no-fork。此時父子pom.xml中插件配置信息合并了,所以出現了2個目標。具體最終javacode2018-pc/pom.xml中的內容是什么樣的,可以通過下面這個命令看到:

mvn help:effective-pom

上面這個命令大家最好去看一下效果,當pom.xml中存在復雜的關系的時候,可以通過這個命令解析得到這個構件最終pom.xml的內容。

聚合與繼承的關系

前面已經詳解了聚合和繼承,想必大家對這塊也有了自己的理解。

聚合主要是為了方便多模塊快速構建。

而繼承主要是為了重用相同的配置。

對于聚合來說,聚合模塊是知道被聚合模塊的存在的,而被聚合模塊是感知不到聚合模塊的存在。

對于繼承來說,父構件是感知不到子構件的存在,而子構件需要使用parent來引用父構件。

兩者的共同點是,聚合模塊和繼承中的父模塊的package屬性都必須是pom類型的,同時,聚合模塊和父模塊中的除了pom.xml,一般都是沒有什么內容的。

實際使用是,我們經常將聚合和繼承一起使用,能同時使用到兩者的優點。

下面我們在javacode2018-parent中加入聚合的配置:

<modules>
    <module>javacode2018-pc</module>
    <module>javacode2018-h5</module>
    <module>javacode2018-api</module>
</modules>

javacode20180-parent/pom.xml目錄運行一下mvn install,看看效果:

D:\code\IdeaProjects\javacode2018-parent>mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] javacode2018-parent                                                [pom]
[INFO] javacode2018-pc                                                    [jar]
[INFO] javacode2018-h5                                                    [jar]
[INFO] javacode2018-api                                                   [jar]
[INFO]
[INFO] ----------------< com.javacode2018:javacode2018-parent >----------------
[INFO] Building javacode2018-parent 1.0-SNAPSHOT                          [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-parent ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-parent\1.0-SNAPSHOT\javacode2018-parent-1.0-SNAPSHOT.pom
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-pc >------------------
[INFO] Building javacode2018-pc 1.0-SNAPSHOT                              [2/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-pc ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-pc ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-pc ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-pc ---
[INFO]
[INFO] --- maven-source-plugin:3.2.0:help (attach-source) @ javacode2018-pc ---
[INFO] Apache Maven Source Plugin 3.2.0
  The Maven Source Plugin creates a JAR archive of the source files of the
  current project.

This plugin has 7 goals:

source:aggregate
  Aggregate sources for all modules in an aggregator project.

source:generated-test-jar
  This plugin bundles all the test sources into a jar archive.

source:help
  Display help information on maven-source-plugin.
  Call mvn source:help -Ddetail=true -Dgoal=<goal-name> to display parameter
  details.

source:jar
  This plugin bundles all the sources into a jar archive.

source:jar-no-fork
  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.

source:test-jar
  This plugin bundles all the test sources into a jar archive.

source:test-jar-no-fork
  This goal bundles all the test sources into a jar archive. This goal functions
  the same as the test-jar goal but does not fork the build, and is suitable for
  attaching to the build lifecycle.


[INFO]
[INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ javacode2018-pc ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-pc ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT.pom
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-pc\target\javacode2018-pc-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-pc\1.0-SNAPSHOT\javacode2018-pc-1.0-SNAPSHOT-sources.jar
[INFO]
[INFO] ------------------< com.javacode2018:javacode2018-h5 >------------------
[INFO] Building javacode2018-h5 1.0-SNAPSHOT                              [3/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-h5 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-h5\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-h5 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-h5 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-h5 ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-h5\target\javacode2018-h5-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-h5 ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-h5\target\javacode2018-h5-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-h5\1.0-SNAPSHOT\javacode2018-h5-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-h5\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-h5\1.0-SNAPSHOT\javacode2018-h5-1.0-SNAPSHOT.pom
[INFO]
[INFO] -----------------< com.javacode2018:javacode2018-api >------------------
[INFO] Building javacode2018-api 1.0-SNAPSHOT                             [4/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ javacode2018-api ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\javacode2018-parent\javacode2018-api\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ javacode2018-api ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ javacode2018-api ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javacode2018-api ---
[INFO] Building jar: D:\code\IdeaProjects\javacode2018-parent\javacode2018-api\target\javacode2018-api-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ javacode2018-api ---
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-api\target\javacode2018-api-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-api\1.0-SNAPSHOT\javacode2018-api-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\javacode2018-parent\javacode2018-api\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\javacode2018-api\1.0-SNAPSHOT\javacode2018-api-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for javacode2018-parent 1.0-SNAPSHOT:
[INFO]
[INFO] javacode2018-parent ................................ SUCCESS [  0.416 s]
[INFO] javacode2018-pc .................................... SUCCESS [  2.654 s]
[INFO] javacode2018-h5 .................................... SUCCESS [  0.262 s]
[INFO] javacode2018-api ................................... SUCCESS [  0.225 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.827 s
[INFO] Finished at: 2019-11-19T17:51:42+08:00
[INFO] ------------------------------------------------------------------------

上篇文章中留下的2個問題

問題1

下面這個配置是干什么的?給哪個插件使用的?

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

編譯代碼的時候,涉及到資源文件和測試資源文件的拷貝,拷貝文件的時候涉及到文件的編碼,這個是設置文件的編碼為UTF-8格式的。


我們在上篇文章的maven-chat06項目的目錄中執行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] Nothing to compile - all classes are up to date
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.179 s
[INFO] Finished at: 2019-11-19T17:57:27+08:00
[INFO] ------------------------------------------------------------------------

可以看到上面有這樣的輸出:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.

從上面可以看出maven-resources-plugin插件的resources目標中會使用這個編碼的配置,我們來看一下這個目標具體參數配置,我們截取了部分輸出,如下:

D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=resources -Dgoal=resources  -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: 'resources:resources'
resources:resources
  Description: Copy resources for the main source code to the main output
    directory. Always uses the project.build.resources element to specify the
    resources to copy.
  Implementation: org.apache.maven.plugin.resources.ResourcesMojo
  Language: java
  Bound to phase: process-resources

  Available parameters:

    delimiters
      Set of delimiters for expressions to filter within the resources. These
      delimiters are specified in the form 'beginToken*endToken'. If no '*' is
      given, the delimiter is assumed to be the same for start and end.

      So, the default filtering delimiters might be specified as:

      <delimiters>
       <delimiter>${*}</delimiter>
       <delimiter>@</delimiter>
      </delimiters>

      Since the '@' delimiter is the same on both ends, we don't need to
      specify '
@*@' (though we can).

    encoding (Default: ${project.build.sourceEncoding})
      User property: encoding
      The character encoding scheme to be applied when filtering resources.

注意上面輸出中最后的一部分,如下:

    encoding (Default: ${project.build.sourceEncoding})
      User property: encoding
      The character encoding scheme to be applied when filtering resources.

encoding這個參數用來指定編碼的,默認值是${project.build.sourceEncoding},也可以通過encoding用戶屬性來設置。

所以這個設置編碼的還有下面3種寫法,共四種:

pom.xml中2種:
<encoding>UTF-8</encoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

mvn命令中2種:
mvn compile -Dencoding=UTF-8
mvn compile -Dproject.build.sourceEncoding=UTF-8

問題2

mvn test運行測試用例的時候,測試用例類名的寫法默認是有規則的,這些規則有人知道么?從哪里可以看到這些規則?如何自定義?

我們在上一篇中的maven-chat06項目中執行mvn 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] 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] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.411 s
[INFO] Finished at: 2019-11-19T18:07:52+08:00
[INFO] ------------------------------------------------------------------------

可以看到下面這行:

[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---

表示運行測試使用的是插件maven-surefire-plugintest目標。

我們看看這個目標詳細參數,只列出部分信息,如下:

D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=surefire -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:

    includes
      A list of <include> elements specifying the tests (by pattern) that
      should be included in testing. When not specified and when the test
      parameter is not specified, the default includes will be
      <includes>
       <include>**/IT*.java</include>
       <include>**/*IT.java</include>
       <include>**/
*ITCase.java</include>
      </includes>
      Each include item may also contain a comma-separated sublist of items,
      which will be treated as multiple  <include> entries.
      This parameter is ignored if the TestNG suiteXmlFiles parameter is
      specified.


[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.458 s
[INFO] Finished at: 2019-11-19T18:10:09+08:00
[INFO] ------------------------------------------------------------------------

可以看到上面有個includes參數,可以用來配置需要運行的測試用例,可以配置通配符的方式。

上面還有一段信息:

 Implementation: org.apache.maven.plugin.surefire.SurefirePlugin

上面這部分列出了這個目標的具體實現類是SurefirePlugin。

那么我們可以到本地倉庫中看一下這個構件的源碼,構件的坐標是:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>

打開org.apache.maven.plugin.surefire.SurefirePlugin的源碼,會找到下面代碼:

protected String[] getDefaultIncludes()
{
    return new String[]{ "**/Test*.java""**/*Test.java""**/*TestCase.java" };
}

這部分代碼就是我們測試用例默認需要滿足的格式,你創建的測試用例默認情況下必須滿足上面這3種格式,否則,測試用例不會被mvn test執行。

總結

  1. 需要掌握聚合的使用

  2. 掌握繼承的使用

  3. 掌握單繼承問題解決方案

  4. 掌握依賴管理和插件管理的使用

還是那句話,建議大家下去了多練練,都操作一遍,加深理解!


java培訓班:http://www.akpsimsu.com/java2019


注釋:本文內容來自公眾號路人甲java




上一篇:java培訓 | 大型Maven項目,快速按需任意構建,必備神技能!

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請