关于java:公司的这种打包启动方式我简直惊呆了

9次阅读

共计 1643 个字符,预计需要花费 5 分钟才能阅读完成。

大家好,我是不才陈某~

大家都晓得,SpringBoot 利用最终会打出一个 Fat Jar, 外面蕴含了用到的全副依赖,启动也非常简单,java -jar xxx.jar 即可。

然而咱们公司打出的最终包,将依赖包挪到了内部,而后启动的时候通过 loader.path 指定依赖包的地位,如 java -Dloader.path=libs -jar xxxx 的形式启动,也可能启动胜利。

这样做最大的一个益处就是如果发现某个依赖呈现问题,那么我只须要在 libs 替换其中某个依赖,影响范畴能够减小很多。

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

关注公众号:码猿技术专栏,回复关键词:1111 获取阿里外部 java 性能调优手册

打包形式详解

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

1. spring-boot-maven-plugin

该插件是 spring boot 官网提供的一个打包插件,次要用来打出 fat jar,并且提供了反对java -jar xxx.jar 形式启动。官网地址:https://docs.spring.io/spring…。

咱们须要用这个插件, 因为只有它能够打出反对启动的 jar,然而打出的包中又不能有依赖,该怎么做呢?如下图:

  • layout: 布局形式,这里要抉择ZIP,前面阐明起因。
  • includes: 抉择蕴含哪些依赖,这里写了一个不存在的 jar,那么也间接实现了不打入其余的依赖。这种形式比拟 ugly,然而目前没有找到更加适合的计划。

2. maven-assembly-plugin

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

咱们当初就是想方法利用该插件抽出咱们用到的依赖包,该怎么做呢?

咱们当初看下 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 命令来启动程序,这样对应目录下的依赖均会被加载。

总结

这种打包启动形式尽管不常见,然而还是有肯定的价值的,特地是在我的项目组件模块比拟多的时候,呈现紧急缺点,能够按需替换包,将影响范畴管制到最小。

正文完
 0