Spring Boot 的 “NestedJarFile” 類別

用來支援載入巢狀 jar 的核心類別是 org.springframework.boot.loader.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 致力於保持與現有程式碼和程式庫的相容性。org.springframework.boot.loader.jar.NestedJarFile 擴充自 java.util.jar.JarFile,應可作為直接替換。

支援 jar:nested:/path/myjar.jar/!BOOT-INF/lib/mylib.jar!/B.class 形式的巢狀 JAR URL,並開啟與 java.net.JarURLConnection 相容的連線。這些可以與 Java 的 URLClassLoader 一起使用。