Java Modules and Multi-Release Jar

Alan Bateman Alan.Bateman at oracle.com
Sun Sep 30 08:33:22 UTC 2018


On 30/09/2018 08:57, Luke Hutchison wrote:
> :
>
> I have a related question about this specifically. I just added 
> multi-release jar support to ClassGraph ( 
> https://github.com/classgraph/classgraph ). If one or more versioned 
> sections are present and the code is running on JRE9+, then the 
> highest-numbered section number less than or equal to the running JRE 
> version is scanned, and the other sections (including the base 
> section) is ignored by ClassGraph. Does this more or less match the 
> JRE semantics, or should I be rather using the versioned section to 
> shadow/mask the base section, but scan / read from both?
>
> ie. does the JRE find resources and classes in both the versioned 
> section and the base section, or does the presence of a versioned 
> section preclude reading from the base section? Your comments seem to 
> indicate the former, since it sounds like module-info.class can be in 
> either the versioned section or the base section, and if it is in the 
> base section, that means module-info.class applies to all versions. 
> That could mean that the base section shadows the version sections, 
> not the other way around (at least for module-info.class).
If you are running on JDK $N then an entry in META-INF/versions/$N will 
override an entry of the same name in versioned sections < $N as well as 
the base section. The JarFile javadoc and JEP 238 describe this in 
detail. One mental model is to think of it as a search path. If you are 
JDK 11 then search path for entries in the JAR file is:

     META-INF/versions/11:META-INF/versions/10:META-INF/versions/9:.

where "." is the top-level directory in the JAR file.

You can also verify your understanding by trying some examples with the 
JarFile API, e.g. open the JarFile with the 4-arg constructor and use 
the versionedStream method to obtain a stream of the JAR entries and 
then map each entry to its real path with JarEntry::getRealPath. This 
might be useful to verify that your library enumerates the correct set 
of entries.

-Alan






More information about the jigsaw-dev mailing list