一、背景介绍: 1、关于SpringBoot工程,在V5中使用后,发现打出的Jar包小则100~260M,大的有300M之多的都有,项目上很多人员抱怨Jar包太大,再构建或传输jar包时,耗时好资源较多。

2、经过初步研究后,发现大部分Jar包其实都没办法通过直接去掉依赖的方式减少,于是只能梳理每个服务的依赖Jar,看看是否有部分用不到的包可以去掉依赖。

3、通过2的想法,经过一系列Jar包大小排序,发现类似pageOffice、ElasticSearch等jar非常大,于是思路就是先看看那些服务用不到的,直接去掉依赖,从而减少最后可执行Jar的大小。

4、但是我一直认为通过3的做法后,减少的jJar大小依然是极少的,而且工作量巨大,需要一个个服务分析,弄不好服务肯能就会异常,于是研究了近2天,终于有个可行的办法了。

5、目前经过初步试验后,发现确实可行,让我现在搭的树蛙平台Jar包从85M,减少到了56M左右,且还是简单做了配置,好啦,现在就看看如何弄的吧,很简单哦。

二、解决步骤: 步骤一:找到项目的pom.xml文件中,spring-boot-maven-plugin插件 增加如下基本配置(红色部分):

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>ZIP</layout>
        <excludes>
            <exclude>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclude>
            <exclude>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
            </exclude>
            <exclude>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
            </exclude>
            <exclude>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
            </exclude>
            <exclude>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </exclude>
            <exclude>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
            </exclude>
        </excludes>
    </configuration>
</plugin>

以上就是先排除那些超过几M的包做了个实验。

步骤二:打包 执行 mvn clean package

步骤三:运行测试 java -jar shuwa-service-product-1.0-SNAPSHOT.jar 这个时候,抛出如下类似异常就对了:

java.lang.NoClassDefFoundError: javax/servlet/Servlet
at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_171]
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_171]
at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_171]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613) ~[spring-core-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524) ~[spring-core-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510) ~[spring-core-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:570) ~[spring-core-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
……

步骤四:找到我们在pom.xml中排除的那些Jar包: 将其放到一个outer_libs文件夹下(以下是我一个个找回的),并把Jar包拷到和目录同级(主要是为了方便)

步骤五:在当前outer_libs文件夹目录执行如下命令,运行下试试看: java -Dloader.path="outer_libs/" -jar shuwa-service-product-1.0-SNAPSHOT.jar

你欣喜的发现,启动成功,跑起来啦,哈哈,还是挺激动吧!!!👌了,后面就是再多找找那些相对大的,第三方共用Jar,给他一一用以上方法处理咯。

三、最后: 等等,别急,此刻的你应该要想到,如果后面采用Docker部署,那这个文件夹怎么办? 总不能在Dockerfile里执行ADD 或COPY到镜像里面吧?那每个镜像不又挺大嘛,是吧!好这个时候很容易想到,通过-v 挂载数据卷的方式实现了,对吧。 嗯,好,后面再找个时间,去试试Docker吧,想法应该没啥大问题了哈。

参考:

https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching
https://blog.csdn.net/shunhua19881987/article/details/78366127
https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching
<layout>ZIP</layout>
         <excludeGroupIds>
           io.jsonwebtoken,
           io.netty,
           com.caucho,
           com.esotericsoftware,
           com.dyuproject.protostuff,
           org.apache.activemq,
           org.bouncycastle,
           commons-io,
           org.json,
           org.antlr,
           org.apache.ws.commons.axiom,
           org.apache.axis2,
           wsdl4j,net.sf.barcode4j,cglib,commons-discovery,
           com.google.zxing,mysql,com.itextpdf,com.lowagie,
           org.icepdf,cn.jpush.api,com.squareup.okhttp3,
           org.tuckey,org.aspectj,jstl,org.apache.taglibs,
           commons-collections,org.beanshell,
           com.google.code.gson,org.restlet.jse,dom4j,opensymphony,
           com.thoughtworks.xstream,org.apache.pdfbox,joda-time,
           com.lowagie,org.apache.axis,javax.xml,commons-beanutils,
           cn.easyproject,commons-dbutils,net.sf.json-lib,
           org.springframework,
           redis.clients,commons-codec,
           com.github.pagehelper,net.sf.ehcache,org.mybatis.spring.boot,
           com.itextpdf,org.freemarker,org.apache.poi,org.apache.poi,
           org.apache.james,org.mybatis.generator,commons-configuration,
           org.apache.commons,commons-net,net.sf.jxls,org.apache.httpcomponents,
           com.fasterxml.jackson.module,org.codehaus.jackson,org.quartz-scheduler,
           org.olap4j,
           net.logstash.logback,org.csource,org.jolokia,com.google.guava,
           org.yaml,org.jboss.logging,commons-digester,com.fasterxml.jackson.dataformat,
           com.fasterxml.jackson.module,com.auth0,org.apache.curator,
           org.activiti,org.jvnet,org.apache.ant,asm,org.ow2.asm,
           org.apache.xmlgraphics,
           bouncycastle,c3p0,commons-fileupload,commons-httpclient,
           commons-lang,commons-pool,org.apache.cxf,
           org.apache.geronimo.specs,com.fasterxml.jackson.core,
           junit,ch.qos.logback,
           org.mybatis,io.reactivex,
           stax,javax.validation,
           xpp3
         </excludeGroupIds>
         <excludeArtifactIds>
           alipay-sdk-java20161226110022,AS_LOG,AS_TS_Client,bwapiclient,chinapayfilesecure,
           chinapaysecure,classmate,common-id,commons-cli,commons-dbcp,DBstep,ecj,emayclient,
           ezmorph,groovy-all,h2,hamcrest-core,hawtbuf,HdrHistogram,hibernate-validator,
           imgscalr-lib,javaGeom,javassist,javax.inject,jaxen,jdom,jgraphx,jline,
           json-simple,jsqlparser,jsr305,javax.ws.rs,jstl,neethi,NetCA,netpayclient,objenesis,
           ojdbc,okio,patchca,pki-tsa-server,signClient,spring-retry,stax2-api,
           ts-api-jdk16,ueditor,vaadin,woden-core,woodstox-core-asl,xmlgraphics-commons,
           xmlpull,xmlschema-core,zcjb-payplat_jdk6
         </excludeArtifactIds>
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐