1.常见的maven Plugin:
编译:
maven-compiler-plugin
:编绎阶段指定jdk版本。
资源/文件等拷贝:
maven-resources-plugin
:拷贝配置等资源文件
maven-dependency-plugin
:拷贝代码所需的jar包,放到classes的lib下
测试阶段:
maven-surefire-plugin
:用于测试阶段的插件
maven-failsafe-plugin
:用作集成测试的配置。
打包:
maven-jar-plugin
:只会把项目的java文件打包成一个jar,比较小,没有把依赖的lib一起打包进去。
spring-boot-maven-plugin
:在maven-jar-plugin
的基础上会生成一个用与启动的文件,并且把依赖的lib一起打包进去项目的jar,这样支持java -jar
直接启动。
打包增强/定制:
maven-assembly-plugin
: 这个插件能在上面打包插件的基础上,更加定制化打包,比如单独放某些文件到classes里面,或者将classes里面的配置放到jar包同层之类的。这样能更加灵活的支持不同场景。
maven-shade-plugin:不用它,这个功能没maven-assembly-plugin
全面,使用maven-assembly-plugin
即可。
部署:
maven-deploy-plugin
: 一般用于将项目发布到远程仓库
其他:
maven-checkstyle-plugin
:可以帮助开发检测代码中不合规范的地方。
jacoco-maven-plugin
:生成单元测试覆盖率报告。
sonar-maven-plugin
:使用该插件执行sonar扫描。
2.不同场景构建模板
1.只需考虑一个jar包运行即可
1.使用maven-compiler-plugin
和maven-jar-plugin
能构建出一个项目的jar,但是里面没有项目依赖的jar包。所以这种适用于在服务器上已经有依赖的jar包了,只是改动一下项目的代码。
如果要把lib打包进去需要再使用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>
但是这种方式打包,如果任何代码里面的配置文件修改了,都需要打包,因为配置文件已经打包到jar包里面的class目录了,没法直接修改。
2.使用maven-compiler-plugin
和spring-boot-maven-plugin
也能构建出一个项目的jar,这种和上面方案的区别就是会把依赖的jar一并打入到项目的jar里面,直接java -jar即可运行,不依赖环境
模板:
<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
通过<resources>的配置来拷贝资源文件,默认是src/main/resource
。
2.maven-compiler-plugin
编译代码变成.class文件。
3.spring-boot-maven-plugin
将文件的所有依赖的jar都打包一个jar文件里面,并且可以指定启动类,这样这个jar直接通过 java -jar xxxx.jar
即可启动。
2.jar包和配置文件分离
2.1 挂载方式
现在很多服务都是用k8s了,很多配置项是会单独挂载出来方便修改的,比如项目里面的application.properties
、log4j.xml
等文件。如果还是按照之前的方式配置文件是会一并打包到项目的jar里面的,这种情况我们就没法绕开每次改配置都要打包的情况。所以就需要把配置分离开到不同的目录,支持灵活的再不重新打包项目的情况下修改配置文件。
2.2 springboot读取配置文件
如果是spring-boot
的jar的话,它支持读jar包外面的文件,同时读取配置文件会有一定的顺序。
Spring boot 配置文件优先级:
1.打包后的 Jar 包以外的 application-.properties;
2.打包后的 Jar 包以外的 application.properties;
3.Jar 包内部的 application-.properties;
4.Jar 包内部的 application.properties。
Jar 包外部的文件比内部的优先级高,特定 Profile 的文件比公共的文件优先级高
指定 profile + 读取外部配置文件:
1.当前目录的 /config 子目录;
2.当前目录;
3.CLASSPATH 中的 /config 目录;
4.CLASSPATH 根目录。
也就是说,如果要读取任何外部文件,不需要额外加任何参数,只需要在jar同级目录下,新建一个config目录,然后把配置文件放进去即可,这样spring boot读取到后,会自动将其中的内容添加到 Spring 的 Environment 中。
2.3 maven-assembly-plugin作用
就可以使用maven-assembly-plugin
来定义好配置文件目录,然后通过挂载来覆盖配置文件,起到不用重新打包也可以修改配置的文件的功能。
模板:
<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>
<!-- 项目的jar包 -->
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>config</outputDirectory>
<includes>
<!-- 项目配置文件 -->
<include>*.properties</include>
<include>*.xml</include>
<include>*.json</include>
</includes>
</fileSet>
</fileSets>
</assembly>
分析:
1.maven-resources-plugin
通过<resources>的配置来拷贝资源文件,默认是src/main/resource
。
2.maven-compiler-plugin
编译代码变成.class文件。
3.spring-boot-maven-plugin
将文件的所有依赖的jar都打包一个jar文件里面,并且可以指定启动类,这样这个jar直接通过 java -jar xxxx.jar
即可启动。
4.maven-assembly-plugin
比如定义好配置文件目录,然后通过挂载来覆盖配置文件,起到不用重新打包也可以修改配置的文件的功能。
assembly.xml
这个文件将 spring-boot-maven-plugin
打包出来的jar拷贝到当前目录,重点是:将classes文件下的配置文件拷贝到config
目录,这个config
是spring-boot会去加载配置文件的目录,这样就能挂载来覆盖配置文件。
工作目录:
config目录的文件: