• springboot jar包瘦身


    说明: 该博文基于springboot 2.4.2版本测试。

    1.普通的打包方式

     <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.pluginsgroupId>
                    <artifactId>maven-compiler-pluginartifactId>
                    <configuration>
                        <source>1.8source>
                        <target>1.8target>
                    configuration>
                plugin>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <version>${spring.boot.version}version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackagegoal>
                            goals>
                        execution>
                    executions>
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注意:如果 maven-compiler-plugin 识别不到版本号,需要手动加 version

    通过maven 的 package 打包后,target目录下会生成如下jar包。

    在这里插入图片描述

    解压后得到如下目录

    在这里插入图片描述

    打开 BOOT-INF,会 lib下有程序所需的,很多的依赖jar。

    在这里插入图片描述
    普通的打包方式直接将包丢到服务器,运行 nohup java -jar xxx.jar & ,程序也就正常跑起来了。但是这样打出来的jar包,体积非常大,运维可能略受影响。

    2.优化后的打包方式

    说明:实际上就是将lib抽取出来,放到指定目录下,后续业务jar启动时,去指定新lib所在的目录。

    • 首先我们需要将未瘦身前的jar包中的 lib复制出来,放到指定目录下。

    注意:最好将标签下有的jar给删除,如果不是该层级结构的项目就忽略。例如我的目录层级,是有一个api模块来存储实体参数的,这种随时可能会更新。(lib包的jar一般是较少变动的第三方包)

    在这里插入图片描述

    这种做法有个缺点,就是后续如果有新的第三方依赖包,也需要手动加该lib目录下。

    • 随后我们就可以开始修改pom文件了
    <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <version>${spring.boot.version}version>
                    <configuration>
                        
                        <mainClass>com.tz4cloud.xxx.xxxxApplicationmainClass>
                        <layout>ZIPlayout>
                        <includes>
                            <include>
                                
                                <groupId>nothinggroupId>
                                <artifactId>nothingartifactId>
                            include>
                        includes>
                    configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackagegoal>
                            goals>
                        execution>
                    executions>
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    实际场景中,我们的业务模块一般还有个 api层,如果是这种目录层级的项目,需要将api也打进lib中。方式如下,只需在 标签中,将api引入。

     <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <version>${spring.boot.version}version>
                    <configuration>
                        <mainClass>com.tz4cloud.xxx.xxxxApplicationmainClass>
                        <layout>ZIPlayout>
                        <includes>
                            
                            <include>
                                <groupId>com.tz4cloudgroupId>
                                <artifactId>tz-common-logartifactId>
                            include>
                        includes>
                    configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackagegoal>
                            goals>
                        execution>
                    executions>
                plugin>
            plugins>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    配置后我们再打包看看,会发现lib下已经没有多余的包了。成功完成了瘦身

    在这里插入图片描述

    接下来只要在启动命令指定新lib所在的目录就可以啦

    java -Dloader.path=/usr/local/services/tz4cloud/lib -jar ./xxxxx-0.0.1-SNAPSHOT.jar
    
    • 1

    其他:
    测试时可以用下面的配置,将lib包打到target目录下,方便我们提取

            
                org.apache.maven.plugins
                maven-dependency-plugin
                
                    
                        copy-dependencies
                        prepare-package
                        
                            copy-dependencies
                        
                        
                            ${project.build.directory}/lib
                            
                            #这里是包路径,自己调整
                                com.sztz
                            
                        
                    
                
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.遇到的问题

    本人在对gateway进行瘦身时,导致了所有项目都无法正常启动,错误如下。
    在这里插入图片描述
    提示也很明显,说的是 gateway中有依赖和 springmvc 的依赖冲突了,要求我删除 springmvc依赖。

    解决方式一:
    gateway启动脚本,在指定 -Dloader.path时,配置自己的lib位置,不与其他共用。

    解决方式二:
    干脆gateway就不瘦身了。。

    如上即可,还得注意别把gateway lib中的包放到共用的lib下哈

  • 相关阅读:
    @EnableConfigurationProperties和@ConfigurationProperties用法及注意事项
    【算法与数据结构】--高级算法和数据结构--哈希表和集合
    前端element的el-tooltip鼠标经过显示文字,没有文字显示空黑框问题
    K8S中的ingress
    DBCO-Maleimide(1395786-30-7)作为巯基反应连接剂有哪些特性!
    Azure 基础
    基于训练和推理场景下的MindStudio高精度对比
    android_root后的玩机:magisk模块&root隐藏
    本地TongWeb7部署web(SpringCloud)项目(Windows)
    java spring运行原理
  • 原文地址:https://blog.csdn.net/evelynnJava/article/details/126499910