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