Spring Boot の "NestedJarFile" クラス
ネストされた jar の読み込みをサポートするために使用されるコアクラスは NestedJarFile
(Javadoc) です。これにより、ネストされた子 jar データから jar コンテンツを読み込むことができます。最初に読み込まれると、各 JarEntry
(標準 Javadoc) の場所は、次の例に示すように、外側の 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 は、既存のコードおよびライブラリとの互換性を維持するよう努めています。NestedJarFile
(Javadoc) は JarFile
(標準 Javadoc) から拡張されており、ドロップイン置換として機能するはずです。
jar:nested:/path/myjar.jar/!BOOT-INF/lib/mylib.jar!/B.class
形式のネストされた JAR URL がサポートされており、JarURLConnection
(標準 Javadoc) と互換性のある接続を開きます。これらは Java の URLClassLoader
(標準 Javadoc) で使用できます。