SpringBoot jar包瘦身,从jar包中分离出依赖包lib和资源文件,方便对线上资源进行维护
一、配置pom文件进行jar包瘦身
1、排除SpringBoot jar包中的其他依赖包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<!-- jar中不包含其他依赖包-->
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
2、拷贝其他依赖到指定目录
<!--拷贝依赖到jar外面的lib目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependency</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--输出目录-->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
3、拷贝资源文件到指定目录
<!-- 拷贝资源文件 到指定的resource目录-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 资源文件输出目录 -->
<outputDirectory>${project.build.directory}/resources</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!--包含的文件-->
<includes>
<include>*/**</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
4、jar包指定资源和依赖包的路径并从Springboot jar包中排除原有资源
<!--指定配置文件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!-- 是否要把第三方jar加入到类构建路径 -->
<addClasspath>true</addClasspath>
<!-- 外部依赖jar包的最终位置 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 配置项目启动类 -->
<mainClass>com.example.model.one.ModeloneApplication</mainClass>
</manifest>
<!-- 指定配置文件的新目录-->
<manifestEntries>
<Class-Path>resources/</Class-Path>
</manifestEntries>
</archive>
<excludes>
<!--以target/classes为根目录-->
<!--资源文件排除-->
<exclude>/*.*</exclude>
<!--html页面排除-->
<exclude>/templates/</exclude>
<!--静态文件排除-->
<exclude>/static/</exclude>
</excludes>
</configuration>
</plugin>
至此Springboot jar包瘦身配置完成
二、mvn打包查看瘦身结果
1、target目录
生成了lib和resource文件
image-20210528153717855.png
2、jar包中
生成的jar包中排除了lib和资源文件
image-20210524145944087.png
3、执行jar查看
在jar包所在目录执行
> java -jar .\model-one.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.4.RELEASE)
===
===
可正常运行
三、Dockerfile编写和Docker打包
1、Dockerfile文件
FROM openjdk:8-jdk-alpine
#指定时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo Asia/Shanghai > /etc/timezone
ARG JAR_FILE
ARG OUT_DIRECTORY
#复制依赖jar
COPY ${OUT_DIRECTORY}/lib /home/project/lib/
#复制配置文件
COPY ${OUT_DIRECTORY}/resources /home/project/resources/
#复制项目jar
COPY ${JAR_FILE} /home/project/model-one.jar
#声明使用的端口,需要-p去绑定宿主机否则将随机绑定
EXPOSE 8081
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /home/project/model-one.jar"]
2、docker插件配置
<!--docker 插件-->
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.35.0</version>
<configuration>
<!-- Docker 远程管理地址-->
<dockerHost>tcp://127.0.0.1:2375</dockerHost>
<!--私服地址不使用可以不配置-->
<!--<registry>私服地址</registry>-->
<images>
<image>
<!--命名空间/仓库名称:镜像版本号-->
<name>${project.artifactId}:${project.version}</name>
<build>
<args>
<!--为Dockerfile中提供参数-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
<OUT_DIRECTORY>target</OUT_DIRECTORY>
</args>
<!--dockerFile位置-->
<dockerFileDir>${project.basedir}</dockerFileDir>
</build>
</image>
</images>
</configuration>
</plugin>
3、docker 打包
1、执行docker build打包
image-20210524152419272.png
2、target目录生成docker tar包
image-20210524160734702.png
3、docker远程服务中出现该镜像
image-20210524160821955.png