New candidate JEP: 493: Linking Run-Time Images without JMODs
Alan Bateman
alan.bateman at oracle.com
Tue Oct 22 09:03:07 UTC 2024
On 21/10/2024 19:19, Alex Buckley wrote:
> On 10/21/2024 9:14 AM, Mark Reinhold wrote:
>> https://openjdk.org/jeps/493
>
> I was surprised to learn that the jlink tool which can link from a
> run-time image is only available in a JDK built with
> --enable-linkable-runtime. As a user, can I tell if the jlink tool in
> my installed JDK consumes JMODs or consumes run-time images?
>
> 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.
>
> If it can consume run-time images _and_ JMODs, which origin is
> preferred when resolving modules passed to --add-modules?
>
> Can it consume only the run-time image it was built as a part of, or
> can I point --module-path to other run-time images? (presumably built
> with --enable-linkable-runtime themselves)
>
> It would be good if the JEP could clarify these points for all readers.
>
> 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.
As a user, the JDK you download may contain a "jmods" directory, it may
not. This should just work:
$JDK/bin/jlink --add-modules java.se --output myjdk
It doesn't matter if jlink uses packaged modules in $JDK/jmods or
reconstitutes the module content from $JDK run-time image by other
means. That was the intention of the example and "The jlink tool in the
resulting JDK works exactly .." in the Description.
Every jlink in every JDK build can consume JMOD files. I'm trying to see
if there is anything in the JEP that suggests otherwise. I don't expect
most developers will come across JMOD files, except developers using
JavaFX where a command line this will just work:
jlink --module-path javafx-mods --add-modules
javafx.graphics,javafx.web,java.se --output myjdk
The JavaFX modules (in JMOD format) will be found in javafx-mods. The
java.* modules will comes from the JDK.
jlink support for using the packaged modules in another JDK is very
limited. You can do this today:
$JDK1/bin/jlink --module-path $JDK2/jmods --add-modules java.se
--output myjdk
but only if $JDK1 and $JDK2 are the same version, otherwise you get an
error like "Error: jlink version 24.0 does not match target java.base
version 22.0".
The motive for this is cross-linking where you run jlink on one platform
to produce the run-time images that you need for all platforms.
The JEP doesn't change anything in this area. This cross linking needs
packaged modules so can't point to the jmods directory of a JDK built
with --enable-linkable-runtime as there is no jmods directory. This is
the "Cross-linking" item in the Restrictions section but it might be
that this term is not widely known so the implications of item 3 may not
be clear.
-Alan
More information about the jigsaw-dev
mailing list