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
前面的示例展示了 A.class 如何在 myapp.jar 中 /BOOT-INF/classes 目錄下位置 0063 處找到。來自巢狀 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 一起使用。