關於Maven的使用,這些你都真的瞭解麼

Maven使用說明及規范

此文檔主要說明Maven的基礎使用方式,以及在使用過程過程中需要遵守哪些默認的準則。

我們工作中會經常寫maven的配置,但是很多maven使用細節你可能並不知道,但你掌握後使用maven會更加上手。

MAVEN是什麼?

Apache Maven是一個軟件項目管理工具。基於項目對象模型(POM)的概念,Maven可以通過一小段描述信息來管理項目的構建,報告和文檔。

Maven的核心是一個插件執行框架, 所有工作都是通過插件完成的。

最熟悉的插件如我們比較常用的:

clean

compiler

install

deploy

除瞭這些默認流程的插件,我們針對Maven的工作機制也制作瞭自己的插件,如 授權系統抽取api.json文件的插件,如通過erm對象描述文件生成Entity實體的插件等。

基本使用

基礎信息

定義pom模型的基本信息

使用Maven構建的項目,首先需要在pom.xml文件中寫明基本信息,如:

<groupId>com.yudianbank.project</groupId> //組織ID
    <artifactId>salesAppParent</artifactId>//工程名稱
    <packaging>pom</packaging>//打包方式,如:jar、war、pom、rar等
    <version>1.0-RELEASES</version> //版本號

由groupId、artifactId、version三個元素定位唯一的jar信息,常說的發個Maven坐標也就是這三個元素

modules 節點,聚合子模塊

在多模塊的項目中使用,用來定義子模塊,一般多模塊項目中,父模塊的packaging都定義為pom

<modules>
        <module>api</module>
        <module>producer</module>
    </modules>

parent節點,繼承其他pom模型的屬性

如:在spring boot項目中,會有如下parent節點,用來繼承spring boot已經定義好的pom

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

properties 節點,定義屬性信息

這個節點一般用於定義一些屬性,用來作為插件的默認值。在這裡定義的屬性可以貫穿Maven build的整個生命周期,Maven屬性是值占位符,可以在pom中通過${XXX}符號來使用

<properties>
        <spring-cloud.version>Dalston.SR3</spring-cloud.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <compiler.version>1.8</compiler.version>
        <powermock.version>1.6.4</powermock.version>
        <checkstyle.version>6.18</checkstyle.version>
    </properties>

除瞭如上手動定義的一些屬性,我們還可以通過如下的方式,訪問到其他的一些變量,如:

  • env.X : 使用“env.”對變量進行前綴。將返回shell的環境變量。例如,$ {env.PATH}包含PATH環境變量。 註意:雖然環境變量本身在Windows上不區分大小寫,但屬性的查找區分大小寫。換句話說,當Windows shell為%PATH%和%Path%返回相同的值時,Maven會區分$ {env.PATH}和$ {env.Path}。從Maven 2.1.0開始,為瞭可靠性,環境變量的名稱被歸一化為所有大寫。
  • project.x : POM中的標記路徑將包含相應元素的值。例如:<project> <version> 1.0 </ version> </ project>可通過$ {project.version}訪問。
  • settings.x : Mavne Home路徑的settings.xml將包含相應的元素的值。例如:<settings> <offline> false </ offline> </ settings>可通過$ {settings.offline}訪問。
  • Java系統屬性 : 通過java.lang.System.getProperties()訪問的所有屬性都可用作POM屬性,例如${java.home}。

dependencies 節點,定義項目依賴

<dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
            </dependency>
        </dependencies>

除瞭基本的groupId、artifactId、version坐標屬性外,dependency節點中還包括如下的常用屬性設置

  • type : 依賴的類型,默認是jar
  • classifier : 分類器,額外的jar坐標標記,用來依賴那些從同一個POM中打出的不同的jar包。
  • scope : 依賴的jar的作用范圍,可選(compile,runtime,test,system,provided)
  • compile : 這是默認范圍。所有類路徑中都提供瞭編譯依賴項。此外,這些依賴項將傳播到依賴項目
  • runtime : 這很像compile,但表示您希望JDK或容器在運行時提供它。它僅在編譯和測試類路徑中可用,並且不可傳遞。
  • test : 此范圍表示正常使用應用程序不需要依賴項,並且僅適用於測試編譯和執行階段。它不是傳遞性的。
  • provided :這很像compile,但表示您希望JDK或容器在運行時提供它。它僅在編譯和測試類路徑中可用,並且不可傳遞。
  • system :此范圍與provided的類似,隻是您必須提供明確包含它的JAR,聲明後不會在存儲庫中查找
  • Systempath:當scope為system生效,用於定義本地依賴的路徑
  • optional :是否啟用依賴傳遞,默認false需要依賴傳遞。如A依賴B,B依賴C,默認情況下A中會有C的依賴,如果在依賴B時設置optional為true,則A中不會有C的依賴
  • exclusions :排除依賴傳遞

dependencies -> exclusions 節點,排除依賴傳遞

有時候為瞭解決項目依賴沖突,需要排除依賴的jar包通過Maven依賴傳遞特性引用的其他jar,如:

<dependency>
            <groupId>com.yudianbank.public</groupId>
            <artifactId>pdf</artifactId>
            <version>1.1-RELEASES</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-pool</groupId>
                    <artifactId>commons-pool</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

關於Maven依賴傳遞特性,當出現多個jar依賴相同的不同版本jar時,遵循兩個原則來引用:

  • 最短路徑原則:如A->B->C-D1 , A->B1->D2 , 那麼最終項目A依賴的D的版本是D2。
  • 最先定義原則: 如A->B->D1 , A->C->D2 , 那麼最終項目A雨來的D的版本是D1.

dependencyManagement 節點,聲明依賴項

dependencyManagement用來管理聲明依賴項,最常見於spring boot項目中,在依賴節點隻需要寫groupId、artifactId就可以定位一個jar坐標,是因為spring boot的父pom中使用dependencyManagement聲明瞭常用的依賴項,如:

<dependencyManagement>
  <dependencies>
   <!-- Spring Boot -->
   <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>1.5.7.RELEASE</version>
   </dependency>
   .......
  </dependencies>
   </dependencyManagement>

使用dependencyManagement管理的依賴隻是聲明瞭,如果沒有顯示的定義在< dependencies >節點中是不生效的

profiles -> profile 節點,定義不同環境的構建屬性

在軟件項目迭代中,通常會有開發、測試、生產等不同的運行環境。很多時候不同的環境需要不同的依賴屬性,諸如此場景,都可以使用profiles來定義不同環境下的變量,如:

<profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!--銷售平臺 api版本-->
                <sales.api.version>1.0-SNAPSHOT</sales.api.version>
                <!--本地日志存儲地址-->
                <logging.path>${basedir}/target/logs</logging.path>
            </properties>
        </profile>
        <profile>
            <id>uat</id>
            <properties>
                <sales.api.version>1.0-SNAPSHOT</sales.api.version>
                <logging.path>/data/logs/${appName}</logging.path>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <sales.api.version>1.0-RELEASES</sales.api.version>
                <logging.path>/data/logs/${appName}</logging.path>
            </properties>
        </profile>   
    </profiles>

repositories、pluginRepositories 節點,定義依賴和插件的倉庫地址

這裡可以定義jar拉取的倉庫地址,除瞭Apache中央倉庫外,還有很多其他的開源倉庫,如spring的,

<repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
 
  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

構建信息

build 節點,設置輸入輸出路徑

為什麼在使用Maven構建的項目中,項目編譯後會在pom所在目錄下生成target目錄?是因為在build構建節點中有如下的默認的配置。

當然,如果你顯示配置瞭如下的屬性,就可以指定編譯後文件的輸出目錄

<build>
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
    <outputDirectory>${basedir}/target/classes</outputDirectory>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    ...
  </build>

build -> resources,定義項目資源

resources用來定義項目的資源路徑,默認的路徑為${basedir}/src/main/resources,在spring boot環境中,繼承瞭spring boot的父pom屬性,它的resources定義如下:

<resources>
   <resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
     <include>**/application*.yml</include>
     <include>**/application*.yaml</include>
     <include>**/application*.properties</include>
    </includes>
   </resource>
   <resource>
    <directory>${basedir}/src/main/resources</directory>
    <excludes>
     <exclude>**/application*.yml</exclude>
     <exclude>**/application*.yaml</exclude>
     <exclude>**/application*.properties</exclude>
    </excludes>
   </resource>
  </resources>

可以看到,spring boot中隻定義瞭三種文件類型的資源,而且通配application開頭的文件。

當項目中有其他的文件類型或不是application開頭時,Maven就會過濾掉。

而且在spring boot中定義瞭屬性占位符為@符號,所以在資源文件中使用${}時並不會生效。

為瞭解決這個問題,可以自己在pom中定義resources屬性覆蓋父pom的行為:如,

<resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>

build -> plugins -> plugin,定義構建插件

plugin這個節點主要用來定義構建的插件,包括自定義和已經發佈到中央倉庫的。如spring boot環境想構建可執行的jar需要添加spring-boot-maven-plugin插件。

<plugins>
            <!掃描url-->
            <plugin>
                <groupId>com.yudianbank.plugin</groupId>
                <artifactId>api-abstractor</artifactId>
                <version>1.1.1-RELEASE</version>
                <executions>
                    <execution>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>createAbstract</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

更多可用的插件:http://maven.apache.org/plugins/index.html

distributionManagement 節點,配置deploy的倉庫地址

當我們自己搭建瞭私服,想要將jar包編譯後上傳到私服時,需要在這個節點配置倉庫的地址,如:

<distributionManagement>
        <repository>
            <id>repo</id>
            <name>User Project Releases</name>
            <url>http://192.168.1.204:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
            <id>repo</id>
            <name>User Project SNAPSHOTS</name>
            <url>http://192.168.1.204:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>

項目信息

根節點下的name、description、url等節點

根節點下的name、description、url等節點用來描述項目的基本信息,如:

<name>sales</name>
      <description>這是一個銷售系統</description>
      <url>http://www.kailing.pub</url>

Licenses節點,描述許可證信息

<licenses>
  <license>
    <name>Apache License, Version 2.0</name>
    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>repo</distribution>
    <comments>A business-friendly OSS license</comments>
  </license>
</licenses>

Organization節點,描述組織信息

<organization>
    <name>keking</name>
    <url>http://www.keking.cn</url>
  </organization>

省略….

遵守的準則規范

MAVEN坐標VERSION屬性設置

一般建議在開發和測試環境中的jar,打成SNAPSHOT的,生產環境的版本打成RELEASES的,這個可以通過上面的profiles節點來控制,他們的區別如下:

  • SNAPSHOT :當版本號帶’-SNAPSHOT’後綴時,既定義發佈的jar為快照版本,應用在依賴時,總是會拉取最新的快照版本。
  • RELEASES :當版本號帶’-RELEASES’後綴時,既定義發佈的jar為發行版,應用依賴時,首次會從遠程倉庫拉取,當本地倉庫已有時,就不會從遠程倉庫拉最新的依賴瞭。RELEASES版本的每次更新必須指定版本號。

開發中的API模塊,需要DEPLOY

應用有些模塊需要提供給別人依賴,比如api模塊、common模塊等。在開發時,每次接口有變動時,記得mvn deploy下,把jar上傳到私服。

依賴的JAR的版本使用屬性控制

建議依賴別的jar時,不要寫死jar的版本,通過properties節點定義的屬性來控制,那麼當你pom被別人依賴時,上層pom可以通過定義屬性值覆蓋父pom中屬性來控制依賴的版本

多模塊項目時,模塊命名規范

在多模塊時,子模塊的命名建議使用父模塊作為前綴,如sales系統,api模塊為sales-api,app模塊為sales-app

附錄,INCUBATOR-SKYWALKING的MAVEN配置,提供參考

<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>org.apache.skywalking</groupId>
    <artifactId>apm</artifactId>
    <version>6.1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.apache</groupId>
        <artifactId>apache</artifactId>
        <version>21</version>
    </parent>

    <modules>
        <module>oap-server</module>
        <module>apm-commons</module>
        <module>apm-sniffer</module>
        <module>apm-application-toolkit</module>
        <module>apm-protocol</module>
        <module>apm-webapp</module>
        <module>apm-dist</module>
        <module>apm-checkstyle</module>
    </modules>
    <packaging>pom</packaging>

    <name>apm</name>
    <url>https://github.com/apache/incubator-skywalking</url>

    <scm>
        <url>https://github.com/apache/incubator-skywalking</url>
        <connection>scm:git:https://github.com/apache/incubator-skywalking.git</connection>
        <developerConnection>scm:git:https://github.com/apache/incubator-skywalking.git</developerConnection>
        <tag>HEAD</tag>
    </scm>

    <issueManagement>
        <system>GitHub</system>
        <url>https://github.com/apache/incubator-skywalking/issues</url>
    </issueManagement>

    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>

    <mailingLists>
        <mailingList>
            <name>SkyWalking Developer List</name>
            <post>[email protected]</post>
            <subscribe>[email protected]</subscribe>
            <unsubscribe>[email protected]</unsubscribe>
        </mailingList>
        <mailingList>
            <name>SkyWalking Commits</name>
            <post>[email protected]</post>
            <subscribe>[email protected]</subscribe>
            <unsubscribe>[email protected]</unsubscribe>
        </mailingList>
    </mailingLists>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <compiler.version>1.8</compiler.version>
        <powermock.version>1.6.4</powermock.version>
        <checkstyle.version>6.18</checkstyle.version>
        <junit.version>4.12</junit.version>
        <mockito-all.version>1.10.19</mockito-all.version>

        <!-- Plugin versions -->
        <docker.plugin.version>0.4.13</docker.plugin.version>
        <takari-maven-plugin.version>0.6.1</takari-maven-plugin.version>
        <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
        <maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
        <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
        <maven-assembly-plugin.version>3.1.0</maven-assembly-plugin.version>
        <maven-failsafe-plugin.version>2.22.0</maven-failsafe-plugin.version>
        <maven-surefire-plugin.version>2.22.0</maven-surefire-plugin.version>
        <maven-jar-plugin.version>3.1.0</maven-jar-plugin.version>
        <maven-shade-plugin.version>3.1.1</maven-shade-plugin.version>
        <maven-enforcer-plugin.version>3.0.0-M2</maven-enforcer-plugin.version>
        <apache-rat-plugin.version>0.12</apache-rat-plugin.version>
        <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
        <maven-resource-plugin.version>3.1.0</maven-resource-plugin.version>
        <maven-source-plugin.version>3.0.1</maven-source-plugin.version>
        <versions-maven-plugin.version>2.5</versions-maven-plugin.version>
        <coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
        <maven-checkstyle-plugin.version>3.0.0</maven-checkstyle-plugin.version>
        <jacoco-maven-plugin.version>0.8.3</jacoco-maven-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <version>${mockito-all.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4</artifactId>
                <version>${powermock.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-mockito</artifactId>
                <version>${powermock.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>git submodule update</id>
                            <phase>initialize</phase>
                            <inherited>false</inherited>
                            <configuration>
                                <executable>git</executable>
                                <arguments>
                                    <argument>submodule</argument>
                                    <argument>update</argument>
                                    <argument>--init</argument>
                                    <argument>--recursive</argument>
                                </arguments>
                            </configuration>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

                <!-- mvn -N io.takari:maven:wrapper -Dmaven=3.5.4 -->
                <plugin>
                    <groupId>io.takari</groupId>
                    <artifactId>maven</artifactId>
                    <version>${takari-maven-plugin.version}</version>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>${exec-maven-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>${maven-antrun-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>${maven-deploy-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>${maven-assembly-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <version>${maven-failsafe-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${maven-surefire-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>${maven-jar-plugin.version}</version>
                </plugin>
                <plugin>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>${maven-shade-plugin.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>${maven-enforcer-plugin.version}</version>
                <executions>
                    <execution>
                        <id>enforce-java</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireJavaVersion>
                                    <!-- Build has not yet been updated for Java 9+ -->
                                    <version>[1.8,9)</version>
                                </requireJavaVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <version>${apache-rat-plugin.version}</version>
                <configuration>
                    <excludes>
                        <exclude>**/target/**</exclude>
                        <exclude>**/DISCLAIMER</exclude>
                        <exclude>**/licenses/**</exclude>
                        <exclude>**/ui-licenses/**</exclude>
                        <exclude>**/codeStyle.xml</exclude>

                        <!-- IDE files -->
                        <exclude>**/*.iml</exclude>
                        <exclude>**/.idea/**</exclude>
                        <exclude>**/*.classpath</exclude>
                        <exclude>**/.project</exclude>
                        <exclude>**/.settings/**</exclude>
                        <exclude>**/dependency-reduced-pom.xml</exclude>

                        <!-- UI IDE configs -->
                        <exclude>**/skywalking-ui/.editorconfig</exclude>
                        <!-- UI Compiler configs -->
                        <exclude>**/skywalking-ui/.webpackrc.js</exclude>
                        <exclude>**/skywalking-ui/.roadhogrc.mock.js</exclude>
                        <!-- UI Test configs -->
                        <exclude>**/skywalking-ui/jest.config.js</exclude>
                        <!-- UI style check files -->
                        <exclude>**/skywalking-ui/.eslintrc.js</exclude>
                        <exclude>**/skywalking-ui/.stylelintrc</exclude>
                        <exclude>**/skywalking-ui/.prettierignore</exclude>
                        <exclude>**/skywalking-ui/.prettierrc</exclude>
                        <!-- UI icon files -->
                        <exclude>**/skywalking-ui/public/font/iconfont/**</exclude>

                        <!-- git files -->
                        <exclude>**/.gitignore</exclude>
                        <exclude>**/.gitmodules</exclude>
                        <exclude>**/.git/**</exclude>

                        <!-- CI files -->
                        <exclude>**/.travis.yml</exclude>

                        <!-- GitHub files -->
                        <exclude>**/.github/**</exclude>

                        <!-- document files -->
                        <exclude>**/*.md</exclude>
                        <excldue>**/*.MD</excldue>
                        <exclude>**/*.txt</exclude>
                        <exclude>**/docs/**</exclude>

                        <!-- Test cases data in JSON format -->
                        <exclude>**/src/test/resources/json/*.json</exclude>

                        <!-- front end libary and generated files -->
                        <exclude>**/skywalking-ui/node_modules/**</exclude>
                        <exclude>**/skywalking-ui/node/**</exclude>
                        <exclude>**/skywalking-ui/dist/**</exclude>

                        <!-- web UI dependencies descriptions -->
                        <exclude>skywalking-ui/package.json</exclude>
                        <exclude>skywalking-ui/package-lock.json</exclude>

                        <!-- Proto files of Istio, envoy, prometheus and gogoproto projects -->
                        <exclude>**/src/main/proto/gogoproto/gogo.proto</exclude>
                        <exclude>**/src/main/proto/envoy/**</exclude>
                        <exclude>**/src/main/proto/google/protobuf/*.proto</exclude>
                        <exclude>**/src/main/proto/prometheus/client_model/metrics.proto</exclude>
                        <exclude>**/src/main/proto/validate/validate.proto</exclude>

                        <!-- generated file from antlr -->
                        <exclude>**/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens</exclude>

                        <!-- Maven Wrapper generated files -->
                        <exclude>.mvn/wrapper/maven-wrapper.properties</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <phase>verify</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <source>${compiler.version}</source>
                    <target>${compiler.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>${maven-resource-plugin.version}</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>${docker.plugin.version}</version>
                <configuration>
                    <skipDocker>true</skipDocker>
                </configuration>
            </plugin>
            <plugin>
                <!-- 源碼插件 -->
                <artifactId>maven-source-plugin</artifactId>
                <version>${maven-source-plugin.version}</version>
                <!-- 發佈時自動將源碼同時發佈的配置 -->
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <phase>none</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>${versions-maven-plugin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.eluder.coveralls</groupId>
                <artifactId>coveralls-maven-plugin</artifactId>
                <version>${coveralls-maven-plugin.version}</version>
                <configuration>
                    <repoToken>xFwR2GqmxcMxV7tGEpW2NfwIrbCD4cQCS</repoToken>
                    <sourceDirectories>
                        <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
                    </sourceDirectories>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco-maven-plugin.version}</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>${maven-checkstyle-plugin.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.skywalking</groupId>
                        <artifactId>apm-checkstyle</artifactId>
                        <version>5.0.0-beta</version>
                    </dependency>
                    <dependency>
                        <groupId>com.puppycrawl.tools</groupId>
                        <artifactId>checkstyle</artifactId>
                        <version>8.11</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>validate</id>
                        <phase>validate</phase>
                        <configuration>
                            <configLocation>skywalking/checkStyle.xml</configLocation>
                            <headerLocation>skywalking/CHECKSTYLE_HEAD</headerLocation>
                            <encoding>UTF-8</encoding>
                            <consoleOutput>true</consoleOutput>
                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
                            <failsOnError>true</failsOnError>
                            <excludes>org.apache.skywalking.apm/network/**/*.java,
                                org.apache.skywalking.apm/collector/remote/grpc/**/*.java,
                                org.apache.skywalking.apm/agent/core/context/ids/base64/*.java
                            </excludes>
                        </configuration>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: