Spring Boot 越来越流行,使用Spring Boot 技术的公司和项目也越来越多, 相比之前框架中大量的配置文件,繁琐的配置确实方便了很多,提高了开发的效率.
不同于传统的War包发布,Spring Boot 把整个项目打包成一个可运行的Jar包,导致了这个Jar包很大(通常有40M+)。如今迭代发布时常有的事情,每次都上传一个如此庞大的文件,会浪费很多时间。
而今微服务框架也越来越成熟,越来越流行,但是每个服务中有大量重复的jar包,不得不说这是一种资源的浪费.
废话不多说直接开始改造现在的项目
一个简单的web服务jar包,可以看一下初始大小就有32MB,几乎全都是引入的包
瘦身只需改一下pom.xml即可
spring boot是用spring-boot-maven-plugin
进行打包,spring官方文档中发现可以通过配置使得该插件在打包时忽略特定的依赖。
先将第三方的jar包导出
在项目pom文件中添加maven依赖插件(官方文档)将第三方的jar包导出
<build>
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>E:/lib</outputDirectory>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
mvn clean install -Dmaven.test.skip=true -DoutputDirectory=E:/lib(-DoutputDirectory=E:/lib是命令动态指定项目依赖的jar包导出的路径,若在项目中指定了outputDirectory的标签值,则将覆盖此动态路径)这里是将所有第三方的jar包都导出了
或者你也可以直接用
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
打包,然后解压,将lib复制出来
然后就开始瘦身了
第一种: 用groupId和artifactId将不需要打包的jar排除
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>E:/lib</outputDirectory>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>-->
</plugins>
</build>
第二种: 使用excludeGroupIds排除
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<excludeGroupIds>
org.springframework.boot,
org.springframework,
org.springframework.data,
org.mongodb,
com.github.0604hx,
com.fasterxml.jackson.core,
commons-beanutils,
commons-codec,
org.apache.commons,
org.apache.tomcat.embed,
org.hibernate,
org.slf4j,
com.jayway,
org.jboss,
com.alibaba,
com.fasterxml,
commons-collections,
ch.qos.logback,
org.scala-lang,
org.yaml,
org.jboss.logging,
javax.validation,
nz.net.ultraq.thymeleaf,
org.thymeleaf,
ognl,
org.unbescape,
org.javassist
</excludeGroupIds>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>E:/lib</outputDirectory>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>-->
</plugins>
</build>
第三种: includes include只保留自己(最精简)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>com.example</groupId> <!--自己的groupId-->
<artifactId>demo</artifactId> <!--自己的artifactId-->
</include>
</includes>
</configuration>
</plugin>
<!--<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>E:/lib</outputDirectory>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>-->
</plugins>
</build>
现在用第三种瘦身方式打个包看一下包的大小
只有92kb,这样每次上传就快多了,几乎可以秒传了
再看一下启动
启动命令和之前有点区别
java -Dloader.path=lib -jar demo-0.0.1-SNAPSHOT.jar
lib文件夹和jar包同级
注意:(浪费我一天)
如果是win10,使用powershell执行启动命令时会出现
这个错不是因为jar包的问题,也不是lib位置有问题, 是因为powershell有问题
使用cmd
正常启动