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