On 10/22/2024 2:17 AM, Severin Gehwolf wrote:
Using --verbose will show this for a run-time image link:

"""
     $ ./runtime-image-link-jdk/bin/jlink --add-modules java.base \
                 --output ./java.base-from-run-time --verbose
     Linking based on the current run-time image.
     java.base jrt:/java.base (run-time image)
...
Conversely, if JMODs are present - for a build with
--enable-linkable-runtime - the verbose output looks as before:

"""
     $ ./jdk/bin/jlink --add-modules java.base \
                 --output ./java.base-from-jmods --verbose
     java.base file:///path/to/jdk/jmods/java.base.jmod
...
I.e. it tells the user where it is taking the bits from (JMODs or run-
time image).

I'm happy to expand the JEP with this detail, but this would be for
expert users and not exactly the intended target audience of JEP
readers. It's not clear if it'll confuse readers of the JEP or provides
clarity.

In no way is this a "detail" for expert users. If I have a JDK on my machine, perhaps provided by my employer or my school, I want to be able to find out if the jlink in that JDK can link from just JMODs or from <<JMODs + run-time images>>. It's a basic question about the functionality of the jlink on my machine. It seems that I can't get the answer by simply running `jlink --help` -- I have to actually do some linking. It would be helpful if the JEP said this plainly in the Description.

I am also not crystal clear whether jlink in a JDK built with
--enable-linkable-runtime is capable of consuming run-time images _and_
JMODs, or just run-time images.

Both. As answered before, if the java.base module is specified on the
module path (or the default module path has JMODs - `$JDK/jmods`) then
it will try to use the java.base.jmod from there. Again, --verbose will
show this distinction. Only if none of the other options are available
it will link from the run-time image.

The JEP needs to explain this JMODs-win policy: "A version of jlink that can consume both JMODs and run-time images always prefers to consume a module from a JMOD on the module path if available. Only if such a module is not found does jlink consume the module from the run-time image of which jlink is part."

As an editorial note, this text can't be true: "The jlink tool in the
resulting JDK works exactly the same way as the jlink tool in a JDK
built with the default configuration." -- the jlink tool in the
resulting JDK will extract from the run-time image, not from JMOD files,
so it's not working "exactly the same way". I think you mean that
_running_ the jlink tool in the resulting JDK is done in exactly the
same way.

Makes sense. How about this?

"""
Invoking the jlink tool in the resulting JDK works exactly the same way
as the jlink tool in a JDK built with the default configuration.
"""

This still suggests that the _effect_ of invoking jlink in the resulting JDK is the same ("works exactly the same way") as invoking jlink in the default configuration. In fact, the effect is different. The thing that is the same is the _user experience_ -- what operands they give to jlink on the command line.

Alex

Reply via email to