转载 

SpringBoot项目打包将依赖包lib放在启动jar外方式

分类:spring,java    440人阅读    IT小君  2022-11-25 21:27

前言

大家都知道,SpringBoot 应用最终会打出一个Fat Jar, 里面包含了用到的全部依赖,启动也非常简单,java -jar xxx.jar即可。

但是我们公司打出的最终包,将依赖包挪到了外部,然后启动的时候通过loader.path指定依赖包的位置,如java -Dloader.path=libs -jar xxxx的方式启动,也能够启动成功。

这样做最大的一个好处就是如果发现某个依赖出现问题,那么我只需要在 libs 替换其中某个依赖,影响范围可以减小很多。

那大家是不是很好奇是怎么做到的呢?

打包方式详解

主要是通过两个 maven 插件打出这样的结构的包。

  1. spring-boot-maven-plugin

该插件是spring boot官方提供的一个打包插件,主要用来打出fat jar,并且提供了支持java -jar xxx.jar方式启动。官网地址:docs.spring.io/spring-boot…[1]

我们需要用这个插件,因为只有它可以打出支持启动的 jar,但是打出的包中又不能有依赖,该怎么做呢?如下图:

  • layout: 布局方式,这里要选择ZIP,后面说明原因。

  • includes: 选择包含哪些依赖,这里写了一个不存在的 jar,那么也间接实现了不打入其他的依赖。这种方式比较 ugly,但是目前没有找到更加合适的方案。

  1. maven-assembly-plugin

maven-assembly-plugin 插件可以灵活定制打包内容,官网地址:maven.apache.org/plugins/mav…[2]

我们现在就是想办法利用该插件抽出我们用到的依赖包,该怎么做呢?

我们现在看下assembly.xml中的关键配置:

  • 可以根据includeexclude属性通过正则灵活的抽取相关依赖到指定的目录下

最终执行mvn clean package在 target 目录下得到最终的安装包:

解压该安装包:

打开 libs 目录:

启动方式解析

现在我们已经按照自己想要的结构打出包了,那如何在启动的时候加载libs目录中的依赖呢?

前面提到了springboot插件打出的包是启动的入口,实际上在这个包里面springboot会自动打入一个引导类org.springframework.boot.loader.Launcher,它是 Spring Boot 可执行 jar 的主要入口点,它是 Spring Boot jar 文件中的实际 Main-Class,用于设置适当的 URLClassLoader 并最终调用 Spring Boot项目中定义的 main()方法。

Launcher有三个子类(JarLauncherWarLauncher 和 PropertiesLauncher),如果我们打包插件的layout配置的是ZIP的方式,它会使用PropertiesLauncher

PropertiesLauncher 机制说明:

默认情况下,PropertiesLauncher 在 BOOT-INF/lib/ 中加载,我们可以通过设置loader.properties 中的loader.path 或 LOADER_PATH 环境变量来增加其它的加载位置。

  • loader.path:配置逗号分隔的 Classpath 类路径,例如 lib,${HOME}/app/lib,前面的路径优先,类似于 javac 命令中的 -classpath
  • loader.home:用于解析 loader.path 配置的相对路径,默认是${user.dir}

所以,打包成功后,我们可以通过 java -jar -Dloader.path=xx1,xx2,public <jarName>.jar 命令来启动程序,这样对应目录下的依赖均会被加载。

总结

这种打包启动方式虽然不常见,但是还是有一定的价值的,特别是在项目组件模块比较多的时候,出现紧急缺陷,可以按需替换包,将影响范围控制到最小。

如果本文对你有帮助,请随手留下一个赞吧。

点击广告,支持我们为你提供更好的服务

js+css3抽奖转盘旋转点餐代码

html5 canvas彩色碎片组合球形旋转动画特效

响应式咖啡饮品宣传网站模板

canvas炫酷鼠标移动文字粒子特效

HTML5 Canvas竖直流动线条背景动画特效

jQuery右端悬浮带返回顶部特效

中小型创意设计服务公司网站模板

html5 svg夜空中星星流星动画场景特效

网页设计开发公司网站模板

现代时尚家具公司网站模板

HTML5数字产品服务公司网站模板

有机水果蔬菜HTML5网站模板

html5 canvas进度条圆环图表统计动画特效

html5图标下拉搜索框自动匹配代码

小众时尚单品在线电子商务网站模板

响应式太阳能能源公司网站模板

HTML5现代家居装潢公司网站模板

css+js实现的颜色渐变数字时钟动画特效

响应式时尚单品在线商城网站模板

css鼠标跟随文字模糊特效

点击广告,支持我们为你提供更好的服务
 工具推荐 更多»
点击广告,支持我们为你提供更好的服务