首页系统综合问题公司的这种打包启动方式,我简直惊呆了

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

时间2022-11-27 20:45:05发布分享专员分类系统综合问题浏览82

前言

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

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

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

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

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

那大家是不是很好奇是怎么做到的呢javac不是内部或外部命令 ?

打包方式详解

主要是通过两个 maven 插件打出这样的结构的包javac不是内部或外部命令 。

spring-boot-maven-plugin

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

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

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

layout : 布局方式,这里要选择 ZIP ,后面说明原因javac不是内部或外部命令 。

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

maven-assembly-plugin

maven-assembly-plugin 插件可以灵活定制打包内容,官网地址: maven.apache.org/plugins/mav…[2] javac不是内部或外部命令 。

我们现在就是想办法利用该插件抽出我们用到的依赖包javac不是内部或外部命令 ,该怎么做呢?

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

javac不是内部或外部命令 我们现在看下 assembly.xml 中的关键配置:

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

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

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

解压该安装包:

打开 libs 目录:

启动方式解析

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

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

Launcher 有三个子类( JarLauncher 、 WarLauncher 和 PropertiesLauncher ),如果我们打包插件的 layout 配置的是 ZIP 的方式,它会使用 PropertiesLauncher javac不是内部或外部命令 。

PropertiesLauncher 机制说明:

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

loader.path :配置逗号分隔的 Classpath 类路径,例如 lib,${HOME}/app/lib ,前面的路径优先,类似于 javac 命令中的 -classpath javac不是内部或外部命令 。

loader.home :用于解析 loader.path 配置的相对路径,默认是 ${user.dir} javac不是内部或外部命令 。

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

总结

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

如果本文对你有帮助,请随手留下一个赞吧javac不是内部或外部命令 。

参考资料

[1]

docs.spring.io/spring-boot…: /

[2]

maven.apache.org/plugins/mav…: /

- EOF -

点击标题可跳转

0、 极客专属:几十款程序员秒懂的卫衣

1、 Meta 从 Java 迁移到 Kotlinjavac不是内部或外部命令 ,已超 1000 万行代码…

2、 居然还有人不知道如何在 IDEA 中生成 Maven 依赖关系图javac不是内部或外部命令 ?

3、 Java 多线程批量操作javac不是内部或外部命令 ,居然有人不做事务控制?

看完本文有收获javac不是内部或外部命令 ?请分享给更多人

推荐关注「Java开发精选」javac不是内部或外部命令 ,提升Java开发技术

点赞和在看就是最大的支持❤️

爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

包启动方式简直惊包启动简直惊javac不是内部或外部命令
(3241-1)每天7点德鲁克-成果或资源不是来源于企业内部,它们来源于企业外部 电脑越用越慢 ,如何解决?以下七个办法也许可以