Rewrite nested jar code to better align with the implementations
provided in Java 17. This update makes two fundamental changes to
the previous implementation:
- Resource cleanup is now handled using the `java.lang.ref.Cleaner`
- Jar URLs now use the form `jar:nested:/my.jar/!nested.jar!/entry`
Unlike the previous `jar🫙/my,jar!/nested.jar!/entry` URL format,
the new format is compatible with Java's default Jar URL handler.
Specifically, it now only uses a single `jar:` prefix and it no longer
includes multiple `!/` separators.
In addition to the changes above, many of the ancillary classes have
also been refactored and updated to create cleaner APIs.
Closes gh-37668
35 lines
1.7 KiB
Plaintext
35 lines
1.7 KiB
Plaintext
[[appendix.executable-jar.jarfile-class]]
|
|
== Spring Boot's "`NestedJarFile`" Class
|
|
The core class used to support loading nested jars is `org.springframework.boot.loader.jar.NestedJarFile`.
|
|
It lets you load jar content from nested child jar data.
|
|
When first loaded, the location of each `JarEntry` is mapped to a physical file offset of the outer jar, as shown in the following example:
|
|
|
|
[indent=0]
|
|
----
|
|
myapp.jar
|
|
+-------------------+-------------------------+
|
|
| /BOOT-INF/classes | /BOOT-INF/lib/mylib.jar |
|
|
|+-----------------+||+-----------+----------+|
|
|
|| A.class ||| B.class | C.class ||
|
|
|+-----------------+||+-----------+----------+|
|
|
+-------------------+-------------------------+
|
|
^ ^ ^
|
|
0063 3452 3980
|
|
----
|
|
|
|
The preceding example shows how `A.class` can be found in `/BOOT-INF/classes` in `myapp.jar` at position `0063`.
|
|
`B.class` from the nested jar can actually be found in `myapp.jar` at position `3452`, and `C.class` is at position `3980`.
|
|
|
|
Armed with this information, we can load specific nested entries by seeking to the appropriate part of the outer jar.
|
|
We do not need to unpack the archive, and we do not need to read all entry data into memory.
|
|
|
|
|
|
|
|
[[appendix.executable-jar.jarfile-class.compatibility]]
|
|
=== Compatibility With the Standard Java "`JarFile`"
|
|
Spring Boot Loader strives to remain compatible with existing code and libraries.
|
|
`org.springframework.boot.loader.jar.NestedJarFile` extends from `java.util.jar.JarFile` and should work as a drop-in replacement.
|
|
|
|
Nested JAR URLs of the form `jar:nested:/path/myjar.jar/!BOOT-INF/lib/mylib.jar!/B.class` are supported and open a connection compatible with `java.net.JarURLConnection`.
|
|
These can be used with Java's `URLClassLoader`.
|