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
で使用できます。