Using jlink with automatic modules

9.5k views Asked by At

I have an explicit modular project which is dependent on an automatic module; e.g. on java.activation. Is it still possible to use jlink?

See this module-info.java:

module hello {
    requires java.activation;
}

Then jlink can't add the module:

$ jlink --module-path target/modules --add-modules hello --output target/jlink
Error: automatic module cannot be used with jlink: java.activation from file:///C:/Development/jlinkExample/target/modules/javax.activation-api-1.2.0.jar

From my understanding, an automatic module would contain the whole classpath anyway. So I guess there would be no benefit to creating a runtime image with jlink?

See also: What is an automatic module?

Are there any possibilities to circumvent this issue? Maybe generating a module-info.java for those dependencies?

1

There are 1 answers

0
Naman On BEST ANSWER

From my understanding an automatic module would contain the whole classpath anyway, so I guess there would be no benefit in creating a runtime-image with jlink?

No, automatic modules would not contain the whole classpath. In fact, the artifacts which are not explicitly defined as modules(contain module-info.java) but are found on the modulepath are treated as automatic modules to bridge the gap between explicit modules and the classpath code.

Are there any possibilities to circumvent this issue, maybe generating a module-info for those dependencies?

Yes, you can either create a module-info.java with jdeps or use plugins like moditect to generate module-info for the module and inject it in your existing JAR.

Once the artifact(JAR) has an explicit module declaration, jlink should accept it without failure.