前言:在工作中,很多客户因为安全、隐私、敏感数据等原因,可能要求項目进行本地化部署;此时,如果一整套系统项目很多,且网络又受限制,咱们就需要给jar瘦身;一般而言,第二次部署的时候,同一个项目的依赖lib是不变的,所以依赖lib在第二次部署时不需要上传;
第一种打包方案:
<!-- Package as an executable jar -->
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>**/*.xml</include>
<include>**/*.txt</include>
<include>**/*.properties</include>
<include>**/*.md</include>
<include>**/*.key</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.jks</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 配置资源文件的打包路径 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<!-- 可选配置 -->
<configuration>
<source>1.8</source>
<!-- 源代码使用的JDK版本 -->
<target>1.8</target>
<!-- 生成的目标class文件的JDK编译版本 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
<!-- 排除不需要打进jar包的文件,也就是上面config目录中的文件 -->
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
<archive>
<!-- 程序入口,即main函数 -->
<manifest>
<mainClass>com.xxx.xxxApplication</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
<manifestEntries>
<Class-Path>config/.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- 把jar复制到target目录下的lib目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}就是我们通常看到的target目录 -->
<outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<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>
<outputDirectory>${project.build.directory}/${project.artifactId}/config</outputDirectory>
<resources>
<resource>
<directory>${project.build.directory}/classes</directory>
<includes>
<include>*.yml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!-- 跳过测试编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<!-- 自定义打包后的jar包名称 -->
<finalName>${project.artifactId}-${project.version}</finalName>
</build>
打包結果:
执行启动命令:nohup java -jar xxx.jar -Dspring.config.location=file:./config/ -Dfile.encoding=utf-8 > /dev/null 2>&1 &
缺点:如果项目中依赖了公司某个共用的lib包,而这个经常会升,此时就需要将升级包和应用小包一起都替换才行;原因是应用小包内部的META-INF下面的MANIFEST.MF文件里面将jar启动和依赖的lib包带上版本的形式固定写死;
优点:启动时,不需要添加额外参数-Dloader.path=./lib;
第二种打包方案:
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>**/*.xml</include>
<include>**/*.txt</include>
<include>**/*.properties</include>
<include>**/*.md</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<!-- 配置资源文件的打包路径 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<!-- 可选配置 -->
<configuration>
<source>1.8</source>
<!-- 源代码使用的JDK版本 -->
<target>1.8</target>
<!-- 生成的目标class文件的JDK编译版本 -->
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.xxx.xxxxApplication</mainClass>
<!-- 排除systemScope的依赖jar -->
<includeSystemScope>false</includeSystemScope>
<!-- 分离jar -->
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
<skip>true</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<delete>
<fileset dir="${project.build.directory}/${project.artifactId}/" includes="*.jar.original"/>
</delete>
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<outputDirectory>${project.build.directory}/${project.artifactId}/</outputDirectory>
<!-- 排除不需要打进jar包的文件,也就是上面config目录中的文件 -->
<excludes>
<exclude>application*.yml</exclude>
</excludes>
</configuration>
</plugin>
<!-- 把jar复制到target目录下的lib目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}就是我们通常看到的target目录 -->
<outputDirectory>${project.build.directory}/${project.artifactId}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<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>
<outputDirectory>${project.build.directory}/${project.artifactId}/config</outputDirectory>
<resources>
<resource>
<directory>${project.build.directory}/classes</directory>
<includes>
<include>application.yml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!-- 跳过测试编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
<!-- 自定义打包后的jar包名称 -->
<finalName>${project.artifactId}-${project.version}</finalName>
</build>
打包結果:
执行启动命令: nohup java -Dloader.path=./lib/ -Dspring.config.location=file:./bb/config/ -Dfile.encoding=utf-8 -jar xxx.jar - > /dev/null 2>&1 &
缺点:启动时,需要添加额外参数-Dloader.path=./lib;
优点:如果项目中依赖了公司某个共用的lib包,而这个经常会升级,此时只需要将共用升级包替换就行;
很旧没有更新博客,后续有时间会持续更新;