我知道spring引导用spring-boot-loader
打包了一个可执行的jar文件,并使用一个名为JarLauncher
的类从BOOT-INF/lib
加载了其他jar文件。
看完这篇文章,我在想Class-Path
在manifest中也可以做到这一点。
那么为什么spring boot要做这么多的工作来从自定义的BOOT-INF/lib
加载jar,而不是简单地在META-INF/MANIFEST.MF
中编写:
Class-Path: BOOT-INF/lib
Class-Path
清单方法不支持从嵌套在jar中的jar文件加载类。从你在问题中链接到的Oracle文档中:
Class-Path头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或通过Internet协议可访问的类。要将JAR文件中的JAR文件中的类加载到类路径中,必须编写自定义代码来加载这些类。例如,如果MyJar.jar包含另一个JAR文件MyUtils.jar,则不能使用MyJar.jar清单中的class - path头将MyUtils.jar中的类加载到类路径中。
Spring Boot的JarLauncher
和spring-boot-loader
中的其他类是自定义代码,允许从一个jar中嵌套的jar中加载类。