前语

假如本文对你有协助的话,球球协助投个票吧,投票通道 感激不尽呀~~

咱们都知道,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…。

咱们需要用这个插件,由于只有它能够打出支撑发动的jar,可是打出的包中又不能有依靠,该怎么做呢?如下图:

公司的这种打包启动方式,我简直惊呆了

  • layout: 布局办法,这里要挑选ZIP,后边阐明原因。
  • includes: 挑选包含哪些依靠,这里写了一个不存在的jar,那么也间接完成了不打入其他的依靠。这种办法比较ugly,可是现在没有找到愈加适宜的方案。
  1. maven-assembly-plugin

maven-assembly-plugin插件能够灵敏定制打包内容,官网地址:maven.apache.org/plugins/mav…。

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

公司的这种打包启动方式,我简直惊呆了

咱们现在看下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有三个子类(JarLauncherWarLauncherPropertiesLauncher),假如咱们打包插件的layout配置的是ZIP的办法,它会运用PropertiesLauncher

PropertiesLauncher机制阐明:

默许情况下,PropertiesLauncherBOOT-INF/lib/ 中加载,咱们能够经过设置loader.properties 中的loader.pathLOADER_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 指令来发动程序,这样对应目录下的依靠均会被加载。

总结

这种打包发动办法虽然不常见,可是还是有必定的价值的,特别是在项目组件模块比较多的时候,出现紧迫缺点,能够按需替换包,将影响规模控制到最小。

假如本文对你有协助的话,球球协助投个票吧,投票通道 感激不尽呀~~

本文正在参加「金石方案 . 分割6万现金大奖」