springboot 应用 jar 瘦身。springboot jar 太大。jar与依赖包分离。
两种方法,第一种,spring-boot-thin-launcher,他将依赖包以maven仓库的形式放到repository目录。
第二种,将依赖包以jar包的方式放到一个目录下,比如libs目录。
这种方式是将jar所以依赖的项,从本地中找(比如windows系统,c:/Users/keboom/.m2),如果没有通过pom文件中的指定的maven仓库下载到默认${user.home}/.m2
文件夹。下载到的位置可以通过thin.root指定,可以看下文,或者下文中GitHub中的详细文档。
https://www.cnblogs.com/niceboat/p/6230448.html
注意自己项目用的是spring-boot-dependencies还是spring-boot-starter-parent
如果是spring-boot-dependencies,那么需要写executions---goals---repackage
如果是spring-boot-starter-parent,那么可以试试廖雪峰的来做廖雪峰springboot jar 瘦身
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.14</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--如果用的是 spring-boot-dependencies ,那么需要配置 repackage -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
用上面的maven打包,回获得一个几十甚至几百兆的包。这个包可以独立运行,因为依赖都打包的这个包里面了。
我们用spring-boot-thin-layout
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>1.0.30.RELEASE</version>
</dependency>
</dependencies>
<!--如果用的是 spring-boot-dependencies ,那么需要配置 repackage -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
我用的windows,maven 本地仓库放到d盘了,而且我的pom里面也没配中央仓库这些,我用的命令为:
java -Dthin.root=. -Dmaven.repo.local=D:\baseTool\mavenRepository -jar myapp.jar
thin.root会将依赖放到myapp.jar 同级目录repository中,maven.repo.local指定从本地maven位置
那么打包下来我是只有一百kb。
spring-boot-thin-launcher Github里面介绍了原理,和相关参数的作用。
第二种方式是,将依赖的jar包都放到一个文件夹下。
将spring-boot-maven-plugin插件删掉
添加一下两个插件
<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}/libs
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>
com.example.MyAppApplication
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
然后进行 mvn clean install,或者用idea的界面去点就好。
这样程序运行后会去libs目录找相应的依赖包。
第一种在能够连接到公司maven仓库时可以使用。但有些项目是部署到客户私有云的,通过给客户升级包的方式升级应用,那么使用第二种方式就更好用,只需要替换相应的jar文件即可。