SpringBoot 项目瘦身 分离lib

背景:公司的项目采用的是微服务的形式部署,每个项目压缩后的包基本都很大,有的真是4、500M,每次poc在客户机器上部署传包都很慢,而且每次做功能更新时,整包替换也很慢,所以需要将项目瘦身。
手段:通过分析发现最大的就是lib文件,所以需要给lib瘦身
  1. 去除不必要的依赖(mvn dependency:analyze)
通过mvn dependency:analyze命令,找到每个项目中引用但是没有使用的jar
Unused declared dependencies found:
 
但是这个不一定准确,有一些我们是有用到的,但是他还是会扫描出来,所以需要仔细确认。
这一步下来发现实际上并没有减少多少.... 毕竟一个项目还是很少会引用大量不必要的依赖的。
  1. 提取公共lib包
通过对比几个服务发现有一些jar包很大,而且多个项目都在使用,因此可以将jar包都放在一起,做一个公共的jar包这样就能减少重复的jar,可以解决每次poc在客户机器上部署传包都很慢的问题
同时将jar包与项目分离,每次项目上线很少会修改jar包,只需要上传代码部分即可,解决了每次做功能更新时,整包替换也很慢的问题
那么该怎么做呢?
  • 分离lib、config、war
修改pom
我们的项目是使用war包方式打包的,同时使用自动化打包。
 
 
 
 
        <plugins>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
            </plugin>

            <!--  引用SpringBoot构建插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
<!--                    <layout>WAR</layout>-->
                    <fork>true</fork>    <!-- hot deploy  -->
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                    <classifier>exec</classifier>
                </configuration>

            </plugin>

            <!-- 引用构建原生War包插件  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <!--如果想要将配置外迁,下面标签去掉注释掉即可-->
                <configuration>
                    <packagingExcludes>
                        <!--排除jar文件-->
                        WEB-INF/lib/*.jar,
                        <!--排除resources文件-->
                        WEB-INF/classes/*.xml,WEB-INF/classes/*.yml,
                        WEB-INF/classes/*.json,
                        <!--排除db文件夹-->
                        WEB-INF/classes/db/ ,
                        <!--排除证书-->
                        WEB-INF/classes/ssl/,
                        WEB-INF/classes/*.jks

                    </packagingExcludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.zorkdata.icube.WebApplication</mainClass>
                        </manifest>
                    </archive>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>

            </plugin>
            <!-- maven资源文件复制插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <!-- here the phase you need -->
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <nonFilteredFileExtensions>
<!--                                &lt;!&ndash;  过滤掉不需要编码的文件:后缀名为jks的文件&ndash;&gt;-->
<!--                                <nonFilteredFileExtension>jks</nonFilteredFileExtension>-->
                            </nonFilteredFileExtensions>
<!--                            <outputDirectory>${project.build.directory}/lib</outputDirectory>-->
                            <outputDirectory>${project.build.directory}/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <includes>
                                        <include>banner.txt</include>
                                        <include>static/*</include>
                                        <include>db/migration/*/*.sql</include>
                                        <include>bootstrap.yml</include>
                                        <include>logback-spring.xml</include>
                                        <include>*.json</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!--             将依赖包单独拷贝到 target/lib 下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-lib</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <includeScope>compile</includeScope>

                        </configuration>
                    </execution>
                </executions>

            </plugin>

打包后
总包还是 171M

 

但是war包 只需要233k 
lib包 近200M
 
这一步已经实现了war包与lib、配置文件分离,下一步就需要在项目中指定lib
  • 启动项目
指定lib的位置使用 -Djava.ext.dirs命令,但是当启动的时候就会报错
命令:java -jar -Djava.ext.dirs=/hbbdir/lib  -server -Dfile.encoding=UTF-8  XXX-exec.war (XXX 项目名)
 
看到这个报错有两个怀疑点:1:配置文件没加载上、2:jar包没加载上
先制定配置文件和其他文件
命令:java -jar -Djava.ext.dirs=/hbbdir/lib  -Xbootclasspath/a:/hbbdir/XXX/config/ -server -Dfile.encoding=UTF-8  XXX-exec.war
再次启动还是这个报错,那么就怀疑是不是jar包没加载上去。
再尝试-Dloader.path命令,项目无法启动,更不行了。
于是就去查看-Djava.ext.dirs命令到底在做什么
百度了一下发现:
-Djava.ext.dirs命令是通过设置系统属性的方式加载jar包的,级别很高,他会覆盖掉Java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果没有通过-Djava.ext.dirs命令指定
加载的ext的lib,他会默认加载java下的/lib/文件夹中的jar以及/jre/lib/ext/下的jar。
而我这个报错刚好是和java.security相关报错,使用了加密是需要这个jar包的。
所以修改命令:java -jar -Djava.ext.dirs=/hbbdir/lib:$JAVA_HOME/lib/:$JAVA_HOME/jre/lib/ext/  -Xbootclasspath/a:/hbbdir/XXX/config/ -server -Dfile.encoding=UTF-8  XXX-exec.war ($JAVA_HOME :改成自己的java所在位置)
启动成功
 
  • 修改自动化脚本
 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值