springboot jar包瘦身

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

1.普通的打包方式

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

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

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

在这里插入图片描述

解压后得到如下目录

在这里插入图片描述

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

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

2.优化后的打包方式

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

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

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

在这里插入图片描述

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

  • 随后我们就可以开始修改pom文件了
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <configuration>
                    <!--启动类-->
                    <mainClass>com.tz4cloud.xxx.xxxxApplication</mainClass>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <!--nothing配置说明打包后不希望lib目录中有任何jar包-->
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

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

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <configuration>
                    <mainClass>com.tz4cloud.xxx.xxxxApplication</mainClass>
                    <layout>ZIP</layout>
                    <includes>
                        <!--期望将api打包进lib-->
                        <include>
                            <groupId>com.tz4cloud</groupId>
                            <artifactId>tz-common-log</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

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

在这里插入图片描述

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

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

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

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeGroupIds>
                        #这里是包路径,自己调整
                            com.sztz
                        </excludeGroupIds>
                    </configuration>
                </execution>
            </executions>
        </plugin>

3.遇到的问题

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值