最近项目在部署使用的过程中,传输JAR包的时候发现JAR包有点大,传输速度有点慢。
笔者基于这个前提对项目的打包配置进行优化进行探索,一般来说lib是很少修改,配置文件会根据需求会有所变动,如果讲配置文件打进JAR生产环境会修改等不便等操作。
以下配置再pom.xml中 <build> <plugins>添加相关配置</plugins></build>
1.指定打包环境和跳过编译单元测试
<!--定义项目的编译环境-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--默认执行src/test/java路径下的测试用例,建议跳过执行-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
2.JAR打包排除配置文件和lib
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<!-- 不打包资源文件,如果放开全量JAR也不会打进去-->
<!-- <excludes>-->
<!-- <exclude>*.yml</exclude>-->
<!-- <exclude>*.properties</exclude>-->
<!-- </excludes>-->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定启动入口类 -->
<mainClass>com.xxxx.Application</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./resources/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
3.如果需要全量包也可以增加如下配置,便于开发环境打包使用
<!--全量JAR包,最初的打包方式,springboot的默认编译插件,默认会把所有的文件打包成一个jar,-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<!--设置springboot的启动类或者是JAR包的启动类-->
<mainClass>com.xxxx.Application</mainClass>
<fork>true</fork>
<addResources>true</addResources>
<outputDirectory>${project.build.directory}/jar</outputDirectory>
</configuration>
</plugin>
4.将lib和配置文件单独复制出来
<!--复制关联JAR包到指定lib打包目录 ,target目录下的文件夹下,按需修改 -->
<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>
<!-- 复制配置文件到指定resources打包目录 ,target目录下的文件夹下,按需修改-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution> <!-- 复制配置文件 -->
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/resources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
5.全量配置如下,拷贝即用,注意启动类的指定:
以下配置再pom.xml中 <build> 添加相关配置</build>
<!--拆分配置文件和LIB,给JAR瘦身-->
<!--启动参考命令,再JAR目录执行,也可以指定绝对路径:
${project.build.directory}工程路径下的target目录
Dloader.path:加载本地lib
Dspring.config.location:加载本地配置
server.port:指定端口
/-/- 这个有转义,注命令要去掉/
java -Dloader.path=lib/ -jar xxxx.jar /-/-Dspring.config.location=resources/ /-/-server.port=8080
-->
<plugins>
<!--定义项目的编译环境-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--默认执行src/test/java路径下的测试用例,建议跳过执行-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!--全量JAR包,最初的打包方式,springboot的默认编译插件,默认会把所有的文件打包成一个jar-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.xxxx</mainClass>
<fork>true</fork>
<addResources>true</addResources>
<outputDirectory>${project.build.directory}/jar</outputDirectory>
</configuration>
</plugin>
<!-- 打JAR包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<!-- 不打包资源文件,如果放开全量JAR也不会打进去-->
<!-- <excludes>-->
<!-- <exclude>*.yml</exclude>-->
<!-- <exclude>*.properties</exclude>-->
<!-- </excludes>-->
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- jar包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定springboot启动入口类 -->
<mainClass>com.xxxx</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./resources/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<!--复制关联JAR包到指定lib打包目录 ,target目录下的文件夹下,按需修改 -->
<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>
<!-- 复制配置文件到指定resources打包目录 ,target目录下的文件夹下,按需修改-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution> <!-- 复制配置文件 -->
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/resources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>