Spring Boot 的 “NestedJarFile” 类

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

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

上述示例展示了如何在 /BOOT-INF/classesmyapp.jar 中于位置 0063 处找到 A.class。 嵌套 JAR 中的 B.class 实际上可在 myapp.jar 中的位置 3452 处找到,而 C.class 位于位置 3980spring-doc.cadn.net.cn

掌握此信息后,我们可以通过定位到外部 JAR 文件的相应部分来加载特定的嵌套条目。 我们无需解压该归档文件,也无需将所有条目数据读入内存。spring-doc.cadn.net.cn

与标准 Java “JarFile” 的兼容性

Spring Boot Loader 致力于保持与现有代码和库的兼容性。 NestedJarFile 继承自 JarFile,可作为即插即用的替代方案使用。spring-doc.cadn.net.cn

支持格式为 jar:nested:/path/myjar.jar/!BOOT-INF/lib/mylib.jar!/B.class 的嵌套 JAR URL,并可打开与 JarURLConnection 兼容的连接。 这些 URL 可与 Java 的 URLClassLoader 配合使用。spring-doc.cadn.net.cn