简直被公司的包装和启动方式惊呆了 格雅百科 2023-10-10 15:53 前言 大家都知道,springBoot应用程序最终会产生一个Fat Jar,里面包含了所有用到的依赖,启动非常简单,java - jar xxx.jar 就足够了。 但是我们公司最终制作的包将依赖包移到了外部,然后在启动时通过loader.path指定依赖包的位置,如java -Dloader.path= libs - Jar xxxx也能成功启动。 这样做的最大好处之一是,如果我发现某个依赖有问题,那么我只需要替换libs中的一个依赖即可,影响的范围可以减少很多。 你好奇它是如何做到的吗? 包装方法详解 主要是通过两个maven插件来生成这样结构的包。 spring-boot-maven-插件 此插件是spring boot官方提供的打包插件。主要用于生成fat jar,并提供对java -jar xxx.jar模式启动的支持。官网地址:https://www.gyballet.com/spring-boot/docs/current/maven-plugin/reference/htmlsingle/。 我们需要使用这个插件,因为它是唯一一个可以生成支持启动的jar,但是生成的包不能有依赖。我们应该做什么?如下图: layout:布局方式,这里需要选择ZIP,原因稍后解释。 includes:选择要包含的依赖项。这里写了一个不存在的jar,也间接阻止了其他依赖的被包含。这种方法比较丑陋,但目前还没有找到更合适的解决方案。 maven 组件插件 maven-assemble-plugin插件可以灵活定制打包内容。官方网站地址为:https://www.gyballet.com/plugins/maven-assemble-plugin/。 我们现在正在尝试使用这个插件来提取我们使用的依赖包。我们应该做什么? 现在我们看一下 assembly.xml中的关键配置: 您可以根据include和exclude属性,灵活地将相关依赖提取到指定目录 最后执行mvn clean package在目标目录中得到最终的安装包: 解压安装包: 打开libs目录: 启动方法分析 现在我们已经按照自己想要的结构打包好了包,那我们如何在启动时加载libs目录下的依赖呢? 前面说过,springboot插件制作的包是启动的入口点。其实在这个包中,springboot会自动进入一个引导类org.springframework.boot .loader.Launcher,这是Spring的主要入口点 Boot可执行jar,这是实际的Main在Spring Boot jar文件中 -Class ,用于设置适当的URLClassLoader并最终调用Spring Boot main()方法。 Launcher 具有三个子类(JarLauncher、WarLauncher 和 PropertiesLauncher ),如果我们打包插件的布局配置 是 ZIP 的工作方式,它使用 PropertiesLauncher。 属性启动器机制说明:默认情况下,PropertiesLauncher加载在BOOT-INF/lib/中,我们可以通过设置loader.properties来设置它装载机。 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 .jar命令来启动程序,这样所有依赖都在相应的目录下将被加载。 总结 这种打包启动方式虽然不常见,但是还是有一定的价值的,特别是当项目有很多组件模块的时候。如果出现紧急缺陷,可以根据需要更换包装,以减少影响范围。控制到最低限度。
还木有评论哦,快来抢沙发吧~