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 兼容的连接。这些 URL 可与 Java 的 URLClassLoader 一起使用。