jar 清单是否支持`Class-Path`?为什么要使用 spring-boot-loader 呢?

问题描述

我知道 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 的 JarLauncherspring-boot-loader 中的其他类是允许从嵌套在 jar 中的 jar 加载类的自定义代码。