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
一起使用。