關(guān)于Maven的使用,這些你都真的了解么
Maven使用說(shuō)明及規(guī)范
此文檔主要說(shuō)明Maven的基礎(chǔ)使用方式,以及在使用過(guò)程過(guò)程中需要遵守哪些默認(rèn)的準(zhǔn)則。
我們工作中會(huì)經(jīng)常寫maven的配置,但是很多maven使用細(xì)節(jié)你可能并不知道,但你掌握后使用maven會(huì)更加上手。
MAVEN是什么?
Apache Maven是一個(gè)軟件項(xiàng)目管理工具?;陧?xiàng)目對(duì)象模型(POM)的概念,Maven可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔。
Maven的核心是一個(gè)插件執(zhí)行框架, 所有工作都是通過(guò)插件完成的。
最熟悉的插件如我們比較常用的:
clean
compiler
install
deploy
除了這些默認(rèn)流程的插件,我們針對(duì)Maven的工作機(jī)制也制作了自己的插件,如 授權(quán)系統(tǒng)抽取api.json文件的插件,如通過(guò)erm對(duì)象描述文件生成Entity實(shí)體的插件等。
基本使用
基礎(chǔ)信息
定義pom模型的基本信息
使用Maven構(gòu)建的項(xiàng)目,首先需要在pom.xml文件中寫明基本信息,如:
<groupId>com.yudianbank.project</groupId> //組織ID
<artifactId>salesAppParent</artifactId>//工程名稱
<packaging>pom</packaging>//打包方式,如:jar、war、pom、rar等
<version>1.0-RELEASES</version> //版本號(hào)
由groupId、artifactId、version三個(gè)元素定位唯一的jar信息,常說(shuō)的發(fā)個(gè)Maven坐標(biāo)也就是這三個(gè)元素
modules 節(jié)點(diǎn),聚合子模塊
在多模塊的項(xiàng)目中使用,用來(lái)定義子模塊,一般多模塊項(xiàng)目中,父模塊的packaging都定義為pom
<modules>
<module>api</module>
<module>producer</module>
</modules>
parent節(jié)點(diǎn),繼承其他pom模型的屬性
如:在spring boot項(xiàng)目中,會(huì)有如下parent節(jié)點(diǎn),用來(lái)繼承spring boot已經(jīng)定義好的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 節(jié)點(diǎn),定義屬性信息
這個(gè)節(jié)點(diǎn)一般用于定義一些屬性,用來(lái)作為插件的默認(rèn)值。在這里定義的屬性可以貫穿Maven build的整個(gè)生命周期,Maven屬性是值占位符,可以在pom中通過(guò)${XXX}符號(hào)來(lái)使用
<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>
除了如上手動(dòng)定義的一些屬性,我們還可以通過(guò)如下的方式,訪問(wèn)到其他的一些變量,如:
env.X: 使用“env.”對(duì)變量進(jìn)行前綴。將返回shell的環(huán)境變量。例如,$ {env.PATH}包含PATH環(huán)境變量。 注意:雖然環(huán)境變量本身在Windows上不區(qū)分大小寫,但屬性的查找區(qū)分大小寫。換句話說(shuō),當(dāng)Windows shell為%PATH%和%Path%返回相同的值時(shí),Maven會(huì)區(qū)分$ {env.PATH}和$ {env.Path}。從Maven 2.1.0開(kāi)始,為了可靠性,環(huán)境變量的名稱被歸一化為所有大寫。project.x: POM中的標(biāo)記路徑將包含相應(yīng)元素的值。例如:<project> <version> 1.0 </ version> </ project>可通過(guò)$ {project.version}訪問(wèn)。settings.x: Mavne Home路徑的settings.xml將包含相應(yīng)的元素的值。例如:<settings> <offline> false </ offline> </ settings>可通過(guò)$ {settings.offline}訪問(wèn)。- Java系統(tǒng)屬性 : 通過(guò)java.lang.System.getProperties()訪問(wèn)的所有屬性都可用作POM屬性,例如${java.home}。
dependencies 節(jié)點(diǎn),定義項(xiàng)目依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
</dependencies>
除了基本的groupId、artifactId、version坐標(biāo)屬性外,dependency節(jié)點(diǎn)中還包括如下的常用屬性設(shè)置
type: 依賴的類型,默認(rèn)是jarclassifier: 分類器,額外的jar坐標(biāo)標(biāo)記,用來(lái)依賴那些從同一個(gè)POM中打出的不同的jar包。scope: 依賴的jar的作用范圍,可選(compile,runtime,test,system,provided)compile: 這是默認(rèn)范圍。所有類路徑中都提供了編譯依賴項(xiàng)。此外,這些依賴項(xiàng)將傳播到依賴項(xiàng)目runtime: 這很像compile,但表示您希望JDK或容器在運(yùn)行時(shí)提供它。它僅在編譯和測(cè)試類路徑中可用,并且不可傳遞。test: 此范圍表示正常使用應(yīng)用程序不需要依賴項(xiàng),并且僅適用于測(cè)試編譯和執(zhí)行階段。它不是傳遞性的。provided:這很像compile,但表示您希望JDK或容器在運(yùn)行時(shí)提供它。它僅在編譯和測(cè)試類路徑中可用,并且不可傳遞。system:此范圍與provided的類似,只是您必須提供明確包含它的JAR,聲明后不會(huì)在存儲(chǔ)庫(kù)中查找Systempath:當(dāng)scope為system生效,用于定義本地依賴的路徑optional:是否啟用依賴傳遞,默認(rèn)false需要依賴傳遞。如A依賴B,B依賴C,默認(rèn)情況下A中會(huì)有C的依賴,如果在依賴B時(shí)設(shè)置optional為true,則A中不會(huì)有C的依賴exclusions:排除依賴傳遞
dependencies -> exclusions 節(jié)點(diǎn),排除依賴傳遞
有時(shí)候?yàn)榱私鉀Q項(xiàng)目依賴沖突,需要排除依賴的jar包通過(guò)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>
關(guān)于Maven依賴傳遞特性,當(dāng)出現(xiàn)多個(gè)jar依賴相同的不同版本jar時(shí),遵循兩個(gè)原則來(lái)引用:
- 最短路徑原則:如A->B->C-D1 , A->B1->D2 , 那么最終項(xiàng)目A依賴的D的版本是D2。
- 最先定義原則: 如A->B->D1 , A->C->D2 , 那么最終項(xiàng)目A雨來(lái)的D的版本是D1.
dependencyManagement 節(jié)點(diǎn),聲明依賴項(xiàng)
dependencyManagement用來(lái)管理聲明依賴項(xiàng),最常見(jiàn)于spring boot項(xiàng)目中,在依賴節(jié)點(diǎn)只需要寫groupId、artifactId就可以定位一個(gè)jar坐標(biāo),是因?yàn)閟pring boot的父pom中使用dependencyManagement聲明了常用的依賴項(xiàng),如:
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
.......
</dependencies>
</dependencyManagement>
使用dependencyManagement管理的依賴只是聲明了,如果沒(méi)有顯示的定義在< dependencies >節(jié)點(diǎn)中是不生效的
profiles -> profile 節(jié)點(diǎn),定義不同環(huán)境的構(gòu)建屬性
在軟件項(xiàng)目迭代中,通常會(huì)有開(kāi)發(fā)、測(cè)試、生產(chǎn)等不同的運(yùn)行環(huán)境。很多時(shí)候不同的環(huán)境需要不同的依賴屬性,諸如此場(chǎng)景,都可以使用profiles來(lái)定義不同環(huán)境下的變量,如:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--銷售平臺(tái) api版本-->
<sales.api.version>1.0-SNAPSHOT</sales.api.version>
<!--本地日志存儲(chǔ)地址-->
<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 節(jié)點(diǎn),定義依賴和插件的倉(cāng)庫(kù)地址
這里可以定義jar拉取的倉(cāng)庫(kù)地址,除了Apache中央倉(cāng)庫(kù)外,還有很多其他的開(kāi)源倉(cāng)庫(kù),如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>
構(gòu)建信息
build 節(jié)點(diǎn),設(shè)置輸入輸出路徑
為什么在使用Maven構(gòu)建的項(xiàng)目中,項(xiàng)目編譯后會(huì)在pom所在目錄下生成target目錄?是因?yàn)樵赽uild構(gòu)建節(jié)點(diǎn)中有如下的默認(rèn)的配置。
當(dāng)然,如果你顯示配置了如下的屬性,就可以指定編譯后文件的輸出目錄
<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,定義項(xiàng)目資源
resources用來(lái)定義項(xiàng)目的資源路徑,默認(rèn)的路徑為${basedir}/src/main/resources,在spring boot環(huán)境中,繼承了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開(kāi)頭的文件。
當(dāng)項(xiàng)目中有其他的文件類型或不是application開(kāi)頭時(shí),Maven就會(huì)過(guò)濾掉。
而且在spring boot中定義了屬性占位符為@符號(hào),所以在資源文件中使用${}時(shí)并不會(huì)生效。
為了解決這個(gè)問(wèn)題,可以自己在pom中定義resources屬性覆蓋父pom的行為:如,
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
build -> plugins -> plugin,定義構(gòu)建插件
plugin這個(gè)節(jié)點(diǎn)主要用來(lái)定義構(gòu)建的插件,包括自定義和已經(jīng)發(fā)布到中央倉(cāng)庫(kù)的。如spring boot環(huán)境想構(gòu)建可執(zhí)行的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 節(jié)點(diǎn),配置deploy的倉(cāng)庫(kù)地址
當(dāng)我們自己搭建了私服,想要將jar包編譯后上傳到私服時(shí),需要在這個(gè)節(jié)點(diǎn)配置倉(cāng)庫(kù)的地址,如:
<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>
項(xiàng)目信息
根節(jié)點(diǎn)下的name、description、url等節(jié)點(diǎn)
根節(jié)點(diǎn)下的name、description、url等節(jié)點(diǎn)用來(lái)描述項(xiàng)目的基本信息,如:
<name>sales</name>
<description>這是一個(gè)銷售系統(tǒng)</description>
<url>http://www.kailing.pub</url>
Licenses節(jié)點(diǎn),描述許可證信息
<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節(jié)點(diǎn),描述組織信息
<organization>
<name>keking</name>
<url>http://www.keking.cn</url>
</organization>
省略....
遵守的準(zhǔn)則規(guī)范
MAVEN坐標(biāo)VERSION屬性設(shè)置
一般建議在開(kāi)發(fā)和測(cè)試環(huán)境中的jar,打成SNAPSHOT的,生產(chǎn)環(huán)境的版本打成RELEASES的,這個(gè)可以通過(guò)上面的profiles節(jié)點(diǎn)來(lái)控制,他們的區(qū)別如下:
SNAPSHOT:當(dāng)版本號(hào)帶'-SNAPSHOT'后綴時(shí),既定義發(fā)布的jar為快照版本,應(yīng)用在依賴時(shí),總是會(huì)拉取最新的快照版本。RELEASES:當(dāng)版本號(hào)帶'-RELEASES'后綴時(shí),既定義發(fā)布的jar為發(fā)行版,應(yīng)用依賴時(shí),首次會(huì)從遠(yuǎn)程倉(cāng)庫(kù)拉取,當(dāng)本地倉(cāng)庫(kù)已有時(shí),就不會(huì)從遠(yuǎn)程倉(cāng)庫(kù)拉最新的依賴了。RELEASES版本的每次更新必須指定版本號(hào)。
開(kāi)發(fā)中的API模塊,需要DEPLOY
應(yīng)用有些模塊需要提供給別人依賴,比如api模塊、common模塊等。在開(kāi)發(fā)時(shí),每次接口有變動(dòng)時(shí),記得mvn deploy下,把jar上傳到私服。
依賴的JAR的版本使用屬性控制
建議依賴別的jar時(shí),不要寫死jar的版本,通過(guò)properties節(jié)點(diǎn)定義的屬性來(lái)控制,那么當(dāng)你pom被別人依賴時(shí),上層pom可以通過(guò)定義屬性值覆蓋父pom中屬性來(lái)控制依賴的版本
多模塊項(xiàng)目時(shí),模塊命名規(guī)范
在多模塊時(shí),子模塊的命名建議使用父模塊作為前綴,如sales系統(tǒng),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>dev@skywalking.incubator.apache.org</post>
<subscribe>dev-subscribe@skywalking.incubator.apache.org</subscribe>
<unsubscribe>dev-unsubscribe@skywalking.incubator.apache.org</unsubscribe>
</mailingList>
<mailingList>
<name>SkyWalking Commits</name>
<post>commits@skywalking.incubator.apache.org</post>
<subscribe>commits-subscribe@skywalking.incubator.apache.org</subscribe>
<unsubscribe>commits-unsubscribe@skywalking.incubator.apache.org</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>
<!-- 發(fā)布時(shí)自動(dòng)將源碼同時(shí)發(fā)布的配置 -->
<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>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信公眾平臺(tái)(測(cè)試接口)準(zhǔn)備工作
想要微信開(kāi)發(fā),首先要有個(gè)服務(wù)器,但是自己沒(méi)有。這時(shí)候可以用花生殼,將內(nèi)網(wǎng)映射到公網(wǎng)上,這樣就可以在公網(wǎng)訪問(wèn)自己的網(wǎng)站了。2016-05-05
spring boot和spring cloud之間的版本關(guān)系
這篇文章主要介紹了spring boot和spring cloud之間的版本關(guān)系,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
SpringBoot實(shí)現(xiàn)Excel讀取的實(shí)例教程
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)Excel讀取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
springboot整合ehcache 實(shí)現(xiàn)支付超時(shí)限制的方法
在線支付系統(tǒng)需要極高的穩(wěn)定性,在有限的系統(tǒng)資源下,穩(wěn)定性優(yōu)先級(jí)要高于系統(tǒng)并發(fā)以及用戶體驗(yàn),因此需要合理的控制用戶的支付請(qǐng)求。下面通過(guò)本文給大家介紹springboot整合ehcache 實(shí)現(xiàn)支付超時(shí)限制的方法,一起看看吧2018-01-01
Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決
這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件
本文主要介紹了IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

