Spring Boot 的“NestedJarFile”类

用于支持加载嵌套 jar 的核心类是 org.springframework.boot.loader.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 努力保持与现有代码和库的兼容性。org.springframework.boot.loader.jar.NestedJarFile 继承自 java.util.jar.JarFile,应该可以作为直接替换使用。

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