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

上記の例は、0063 の myapp.jar の /BOOT-INF/classes で 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 で使用できます。