jmod and modular MR jars

Alan Bateman Alan.Bateman at
Sat Oct 14 08:25:37 UTC 2017

On 13/10/2017 21:54, Ryan Schmitt wrote:
> :
> In the general case, I do have to worry about native libraries. I'm 
> trying to figure out what it would mean to add end-to-end support for 
> fully modularized Jigsaw applications to my company's build 
> infrastructure, and JMOD packaging *might* be a good default strategy 
> for tackling that problem. However, I'm not sure how `jmod` interacts 
> with MR JAR files. There are three possibilities here:
> (1) I'm invoking `jmod` incorrectly. I'm using (jmod create 
> --class-path <MR jar file containing a module> <jmod file>`)
> (2) There is a bug in `jmod` that prevents it from identifying and 
> using META-INF/versions/9/module-info.class
> (3) `jmod`, like `javac`, intentionally disregards classes in the 
> META-INF/versions area
> I don't see anything in JEP 238 or JEP 261 to suggest that (3) would 
> be the case, nor do I see any documented `jmod` flags that would be 
> relevant to MR jars (similar to the `--multi-release` argument to 
> `jdeps`).
The JMOD format does not have the equivalent of META-INF/versions. The 
`jmod` tool does not know anything about MR JARs.

When you create a JMOD file with the `jmod` tool then you must specify 
the location of the classes, launchers, native libraries, license files, 
etc. to include. For the classes then you'll typically specify the 
top-level directory (where module-info.class exists). The `jmod` tool 
can read the classes from a modular JAR too but it has no support for 
reading the classes from a modular MR JARs. In particular, it will 
always reject modular MR JARs where the module-info.class is in a 
versioned section rather than the top-level directory.

Yes, it's technically possible of course, at least for the case where 
you choose the version at packaging time so that the resulting JMOD only 
contains the classes/resources to target a specific JDK version. 
Deferring the version selection to link time would mean the JMOD format 
would need to support the equivalent of META-INF/versions.

As regards `javac` (which you mention in #3) then it does support MR 
JARs (I assume that is a typo in your mail and you mention another tool, 
maybe `javap`).


More information about the jdk9-dev mailing list