一、背景介绍: 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>