maven jar包瘦身

springCloud项目系统瘦身记录

第一章

**尝试spring-boot-thin-launcher**

Spring Boot项目可以通过spring-boot-maven-plugin插件打包生成一个可执行的jar包,这样可以脱离web容器(例如tomcat)直接运行。但默认情况下spring-boot-maven-plugin打出来的包是一个fat jar,即将所有的依赖全部打进了jar包当中,这样的jar包体积很大,每次更新系统的时候都需要完整替换整个jar包(本地还好,如果是云服务器,网速慢了每次上传文件都想砸电脑π__π)。此外,系统切换环境时,也同时需要切换配置参数,虽然可以使用配置中心或者利用命令行参数修改配置,但有时候也免不了直接需要修改配置文件,这样的话就有必要将配置文件从jar包中分离出来,单独存放。

Spring社区大概也考虑到了部分开发者有这样的需求,所以提供了spring-boot-thin-launcher这个插件用来将项目的依赖和配置从jar包中分离出去。这个插件是放在spring-projects-experimental

使用方法

 <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <!-- 加入该配置,使用maven package,依赖jar不会打包在项目最终jar文件内 -->
                        <groupId>org.springframework.boot.experimental</groupId>
                        <artifactId>spring-boot-thin-layout</artifactId>
                        <version>1.0.23.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
            <!-- 加入该配置,maven package执行时会在target目录整理好依赖包 -->
            <plugin>
                <groupId>org.springframework.boot.experimental</groupId>
                <artifactId>spring-boot-thin-maven-plugin</artifactId>
                <version>1.0.23.RELEASE</version>
                <executions>
                    <execution>
                        <!-- Download the dependencies at build time -->
                        <id>resolve</id>
                        <goals>
                            <goal>resolve</goal>
                        </goals>
                        <inherited>false</inherited>
                    </execution>
                </executions>
            </plugin>

加入以上插件打包时仅会打包代码部分不会去将依赖打包进jar包,所以我们打出来的文件就会很小
这个我写的案例打的包
代码中第二个插件起到的作用就是将对应的依赖包打包进上图中thin文件夹里面,在jar包启动时指定thin里面的路径即可完美的启动jar 例:(java -Dthin.root=path/to/lib -jar spring-boot-app.jar)

问题:在自己创建的demo中实验没什么问题,因为最终是公司的正式项目(SpringCloud项目)需要进行jar瘦身,所以在测试环境进行实验时总是会报错目测是和连接池有冲突具体原因没找到所以感觉这个插件可能不太适合 ,下面介绍另外一种方式

第二章

配置可执行jar包中Main-Class的类型,使打的jar包中的Main-Class为PropertiesLauncher 。

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <layout>ZIP</layout>
                     <includes>
                         <include>
                             <groupId>nothing</groupId>
                             <artifactId>nothing</artifactId>
                         </include>
                     </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

注意
一、这里layout一定要设置为 ZIP
二、includes 是将需要保留的jar包,按照groupId和artifactId(注意两个都是必填项)include进来。
nothing 代表不存在的依赖包,意思就是什么依赖包都不引入

将插件引入后进行打包操作

通过压解工具查看jar包里面META-INF目录下的MANIFEST.MF文件:
在这里插入图片描述
发现Main-Class的值确实变为了PropertiesLauncher ,说明我们的配置成功。

下图为jar大小对比

在这里插入图片描述
将jar 放入测试服务器配置好对应的启动文件启动
在这里插入图片描述
在这里插入图片描述

完美运行

原理探究

为什么将可执行jar包的Main-Class设置为PropertiesLauncher就可以通过配置启动参数loader.path指定依赖包的加载路径呢?
首先我们对spring boot可执行jar包实现原理中的启动器Launcher有所了解。

以下摘自spring boot官网


org.springframework.boot.loader.Launcher类是特殊的引导程序类,用作可执行jar的主要入口点。它是jar文件中的实际Main-Class,用于设置适当的URLClassLoader并最终调用main()方法。

有三个启动器子类(JarLauncher,WarLauncher和PropertiesLauncher)。它们的目的是从目录中的嵌套jar文件或war文件(而不是在类路径中显式的文件)加载资源(.class文件等)。对于JarLauncher和WarLauncher,嵌套路径是固定的。 JarLauncher位于BOOT-INF / lib /中,而WarLauncher位于WEB-INF / lib /和WEB-INF / lib-provided /中。如果需要,可以在这些位置添加额外的罐子。默认情况下,PropertiesLauncher在您的应用程序存档中的BOOT-INF / lib /中查找。您可以通过在loader.properties(这是目录,归档文件或归档文件中的目录的逗号分隔列表)中设置一个称为LOADER_PATH或loader.path的环境变量来添加其他位置。

也就是说启动器Launcher是为了项目启动加载依赖资源的,共有3个启动器(JarLauncher,WarLauncher和PropertiesLauncher),其中JarLauncher和WarLauncher加载资源的路径是固定的,而PropertiesLauncher可以通过环境变量loader.path来指定加载资源的位置。
在这里插入图片描述

layout属性值说明:

JAR,即通常的可执行jar
Main-Class: org.springframework.boot.loader.JarLauncher

WAR,即通常的可执行war,需要的servlet容器依赖位于
Main-Class: org.springframework.boot.loader.warLauncher

ZIP,即DIR,类似于JAR
Main-Class: org.springframework.boot.loader.PropertiesLauncher
(记住这个就好,其他的应用场景比较少)

PropertiesLauncher属性配置

PropertiesLauncher具有一些可以通过外部属性(系统属性,环境变量,清单条目或loader.properties)启用的特殊功能。 下表描述了这些属性:

Key目的
loader.pathlib包加载路径
loader.home用于解析loader.path中的相对路径。 例如,给定loader.path = lib,则$ {loader.home} / lib是类路径位置(以及该目录中的所有jar文件)。 此属性还用于查找loader.properties文件,如以下示例/ opt / app所示。它默认为$ {user.dir}。
loader.argsmain方法的默认参数(以空格分隔)。
loader.main要启动的主类的名称(例如com.app.Application)
loader.config.name属性文件的路径(例如,classpath:loader.properties)。 默认为loader.properties。
loader.system布尔值标志,指示应将所有属性添加到系统属性。 默认为false。

参考链接:https://blog.csdn.net/w1014074794/article/details/106445145

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值