Spring Boot 的 “NestedJarFile” 类

用于支持加载嵌套 jar 的核心类是 NestedJarFile。 它允许您从嵌套的子 jar 数据中加载 jar 内容。 首次加载时,每个 JarEntry 的位置都会被映射到外部 jar 的物理文件偏移量,如下例所示:

myapp.jar
+-------------------+-------------------------+
| /BOOT-INF/classes | /BOOT-INF/lib/mylib.jar |
|+-----------------+||+-----------+----------+|
||     A.class      |||  B.class  |  C.class ||
|+-----------------+||+-----------+----------+|
+-------------------+-------------------------+
 ^                    ^           ^
 0063                 3452        3980

前面的示例显示了如何在 myapp.jar 中的 /BOOT-INF/classes 位置 0063 找到 A.class。 嵌套 jar 中的 B.class 实际上可以在 myapp.jar 的位置 3452 找到,而 C.class 在位置 3980

有了这些信息,我们可以通过定位到外部 jar 的适当部分来加载特定的嵌套条目。 我们不需要解压归档文件,也不需要将所有条目数据读入内存。

与标准 Java “JarFile” 的兼容性

Spring Boot Loader 努力保持与现有代码和库的兼容性。 NestedJarFile 继承自 JarFile,应该可以作为直接替代品使用。

支持 jar:nested:/path/myjar.jar/!BOOT-INF/lib/mylib.jar!/B.class 形式的嵌套 JAR URL,并打开与 JarURLConnection 兼容的连接。 这些可以与 Java 的 URLClassLoader 一起使用。