1.常見(jiàn)的maven Plugin:
編譯:
maven-compiler-plugin
:編繹階段指定jdk版本斑胜。
資源/文件等拷貝:
maven-resources-plugin
:拷貝配置等資源文件
maven-dependency-plugin
:拷貝代碼所需的jar包,放到classes的lib下
測(cè)試階段:
maven-surefire-plugin
:用于測(cè)試階段的插件
maven-failsafe-plugin
:用作集成測(cè)試的配置倒庵。
打包:
maven-jar-plugin
:只會(huì)把項(xiàng)目的java文件打包成一個(gè)jar,比較小檀蹋,沒(méi)有把依賴的lib一起打包進(jìn)去绿饵。
spring-boot-maven-plugin
:在maven-jar-plugin
的基礎(chǔ)上會(huì)生成一個(gè)用與啟動(dòng)的文件娃闲,并且把依賴的lib一起打包進(jìn)去項(xiàng)目的jar,這樣支持java -jar
直接啟動(dòng)围来。
打包增強(qiáng)/定制:
maven-assembly-plugin
: 這個(gè)插件能在上面打包插件的基礎(chǔ)上跺涤,更加定制化打包匈睁,比如單獨(dú)放某些文件到classes里面,或者將classes里面的配置放到j(luò)ar包同層之類的桶错。這樣能更加靈活的支持不同場(chǎng)景航唆。
maven-shade-plugin:不用它,這個(gè)功能沒(méi)maven-assembly-plugin
全面牛曹,使用maven-assembly-plugin
即可佛点。
部署:
maven-deploy-plugin
: 一般用于將項(xiàng)目發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)
其他:
maven-checkstyle-plugin
:可以幫助開發(fā)檢測(cè)代碼中不合規(guī)范的地方。
jacoco-maven-plugin
:生成單元測(cè)試覆蓋率報(bào)告黎比。
sonar-maven-plugin
:使用該插件執(zhí)行sonar掃描超营。
2.不同場(chǎng)景構(gòu)建模板
1.只需考慮一個(gè)jar包運(yùn)行即可
1.使用maven-compiler-plugin
和maven-jar-plugin
能構(gòu)建出一個(gè)項(xiàng)目的jar,但是里面沒(méi)有項(xiàng)目依賴的jar包阅虫。所以這種適用于在服務(wù)器上已經(jīng)有依賴的jar包了演闭,只是改動(dòng)一下項(xiàng)目的代碼。
如果要把lib打包進(jìn)去需要再使用maven-dependency-plugin
颓帝,把依賴的jar打包到lib里面米碰。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
executions>
</plugin>
但是這種方式打包,如果任何代碼里面的配置文件修改了购城,都需要打包吕座,因?yàn)榕渲梦募呀?jīng)打包到j(luò)ar包里面的class目錄了,沒(méi)法直接修改瘪板。
2.使用maven-compiler-plugin
和spring-boot-maven-plugin
也能構(gòu)建出一個(gè)項(xiàng)目的jar吴趴,這種和上面方案的區(qū)別就是會(huì)把依賴的jar一并打入到項(xiàng)目的jar里面,直接java -jar即可運(yùn)行侮攀,不依賴環(huán)境
模板:
<build>
<finalName>xxx-xxx-activity-core</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>${file_encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.2.RELEASE</version>
<configuration>
<mainClass>com.xx.activity.core.ActivityApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
分析:
1.maven-resources-plugin
通過(guò)<resources>的配置來(lái)拷貝資源文件锣枝,默認(rèn)是src/main/resource
。
2.maven-compiler-plugin
編譯代碼變成.class文件兰英。
3.spring-boot-maven-plugin
將文件的所有依賴的jar都打包一個(gè)jar文件里面撇叁,并且可以指定啟動(dòng)類,這樣這個(gè)jar直接通過(guò) java -jar xxxx.jar
即可啟動(dòng)畦贸。
2.jar包和配置文件分離
2.1 掛載方式
現(xiàn)在很多服務(wù)都是用k8s了陨闹,很多配置項(xiàng)是會(huì)單獨(dú)掛載出來(lái)方便修改的,比如項(xiàng)目里面的application.properties
薄坏、log4j.xml
等文件正林。如果還是按照之前的方式配置文件是會(huì)一并打包到項(xiàng)目的jar里面的,這種情況我們就沒(méi)法繞開每次改配置都要打包的情況颤殴。所以就需要把配置分離開到不同的目錄觅廓,支持靈活的再不重新打包項(xiàng)目的情況下修改配置文件。
2.2 springboot讀取配置文件
如果是spring-boot
的jar的話涵但,它支持讀jar包外面的文件杈绸,同時(shí)讀取配置文件會(huì)有一定的順序帖蔓。
Spring boot 配置文件優(yōu)先級(jí):
1.打包后的 Jar 包以外的 application-.properties;
2.打包后的 Jar 包以外的 application.properties瞳脓;
3.Jar 包內(nèi)部的 application-.properties塑娇;
4.Jar 包內(nèi)部的 application.properties。
Jar 包外部的文件比內(nèi)部的優(yōu)先級(jí)高劫侧,特定 Profile 的文件比公共的文件優(yōu)先級(jí)高
指定 profile + 讀取外部配置文件:
1.當(dāng)前目錄的 /config 子目錄埋酬;
2.當(dāng)前目錄;
3.CLASSPATH 中的 /config 目錄烧栋;
4.CLASSPATH 根目錄写妥。
也就是說(shuō),如果要讀取任何外部文件审姓,不需要額外加任何參數(shù)珍特,只需要在jar同級(jí)目錄下,新建一個(gè)config目錄魔吐,然后把配置文件放進(jìn)去即可扎筒,這樣spring boot讀取到后,會(huì)自動(dòng)將其中的內(nèi)容添加到 Spring 的 Environment 中酬姆。
2.3 maven-assembly-plugin作用
就可以使用maven-assembly-plugin
來(lái)定義好配置文件目錄嗜桌,然后通過(guò)掛載來(lái)覆蓋配置文件纲酗,起到不用重新打包也可以修改配置的文件的功能匿值。
模板:
<build>
<finalName>xxx-xxx-activity-core</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources/profiles/${spring.profiles.active}/config</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>${file_encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.2.RELEASE</version>
<configuration>
<mainClass>com.xx.activity.core.ActivityApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
<finalName>${project.artifactId}</finalName>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
assembly.xml文件:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<!-- 項(xiàng)目的jar包 -->
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>config</outputDirectory>
<includes>
<!-- 項(xiàng)目配置文件 -->
<include>*.properties</include>
<include>*.xml</include>
<include>*.json</include>
</includes>
</fileSet>
</fileSets>
</assembly>
分析:
1.maven-resources-plugin
通過(guò)<resources>的配置來(lái)拷貝資源文件,默認(rèn)是src/main/resource
媚狰。
2.maven-compiler-plugin
編譯代碼變成.class文件淫僻。
3.spring-boot-maven-plugin
將文件的所有依賴的jar都打包一個(gè)jar文件里面诱篷,并且可以指定啟動(dòng)類壶唤,這樣這個(gè)jar直接通過(guò) java -jar xxxx.jar
即可啟動(dòng)雳灵。
4.maven-assembly-plugin
比如定義好配置文件目錄,然后通過(guò)掛載來(lái)覆蓋配置文件闸盔,起到不用重新打包也可以修改配置的文件的功能悯辙。
assembly.xml
這個(gè)文件將 spring-boot-maven-plugin
打包出來(lái)的jar拷貝到當(dāng)前目錄,重點(diǎn)是:將classes文件下的配置文件拷貝到config
目錄迎吵,這個(gè)config
是spring-boot會(huì)去加載配置文件的目錄躲撰,這樣就能掛載來(lái)覆蓋配置文件。
工作目錄:
config目錄的文件: