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