This might be a strange use case, but this fails on a jlink run on JDK 23.0.1:
$ ./jdk-23.0.1/bin/jlink -J-showversion --add-modules java.desktop --limit-modules jdk.jfr --output testme-img --verbose
openjdk version "23.0.1" 2024-10-15
OpenJDK Runtime Environment (build 23.0.1+11-39)
OpenJDK 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
Error: Module java.datatransfer not found, required by java.desktop
java.lang.module.FindException: Module java.datatransfer not found, required by java.desktop
at java.base/java.lang.module.Resolver.findFail(Resolver.java:892)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:420)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:254)
at jdk.jlink/jdk.tools.jlink.internal.Jlink$JlinkConfiguration.resolve(Jlink.java:206)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImageProvider(JlinkTask.java:525)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:410)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:285)
at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:56)
at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:34)
Removing the module limit works:
$ rm -rf testme-img && ./jdk-23.0.1/bin/jlink -J-showversion --add-modules java.desktop --output testme-img --verbose
openjdk version "23.0.1" 2024-10-15
OpenJDK Runtime Environment (build 23.0.1+11-39)
OpenJDK 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
java.base file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.base.jmod
java.datatransfer file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.datatransfer.jmod
java.desktop file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.desktop.jmod
java.prefs file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.prefs.jmod
java.xml file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.xml.jmod
Providers:
java.desktop provides java.net.ContentHandlerFactory used by java.base
java.base provides java.nio.file.spi.FileSystemProvider used by java.base
java.desktop provides javax.print.PrintServiceLookup used by java.desktop
java.desktop provides javax.print.StreamPrintServiceFactory used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiDeviceProvider used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiFileReader used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiFileWriter used by java.desktop
java.desktop provides javax.sound.midi.spi.SoundbankReader used by java.desktop
java.desktop provides javax.sound.sampled.spi.AudioFileReader used by java.desktop
java.desktop provides javax.sound.sampled.spi.AudioFileWriter used by java.desktop
java.desktop provides javax.sound.sampled.spi.FormatConversionProvider used by java.desktop
java.desktop provides javax.sound.sampled.spi.MixerProvider used by java.desktop
java.desktop provides sun.datatransfer.DesktopDatatransferService used by java.datatransfer
This should probably be handled a bit nicer.
$ ./jdk-23.0.1/bin/jlink -J-showversion --add-modules java.desktop --limit-modules jdk.jfr --output testme-img --verbose
openjdk version "23.0.1" 2024-10-15
OpenJDK Runtime Environment (build 23.0.1+11-39)
OpenJDK 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
Error: Module java.datatransfer not found, required by java.desktop
java.lang.module.FindException: Module java.datatransfer not found, required by java.desktop
at java.base/java.lang.module.Resolver.findFail(Resolver.java:892)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:420)
at java.base/java.lang.module.Configuration.resolve(Configuration.java:254)
at jdk.jlink/jdk.tools.jlink.internal.Jlink$JlinkConfiguration.resolve(Jlink.java:206)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImageProvider(JlinkTask.java:525)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:410)
at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:285)
at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:56)
at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:34)
Removing the module limit works:
$ rm -rf testme-img && ./jdk-23.0.1/bin/jlink -J-showversion --add-modules java.desktop --output testme-img --verbose
openjdk version "23.0.1" 2024-10-15
OpenJDK Runtime Environment (build 23.0.1+11-39)
OpenJDK 64-Bit Server VM (build 23.0.1+11-39, mixed mode, sharing)
java.base file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.base.jmod
java.datatransfer file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.datatransfer.jmod
java.desktop file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.desktop.jmod
java.prefs file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.prefs.jmod
java.xml file:///disk/openjdk/builds/oracle-ea/jdk-23.0.1/jmods/java.xml.jmod
Providers:
java.desktop provides java.net.ContentHandlerFactory used by java.base
java.base provides java.nio.file.spi.FileSystemProvider used by java.base
java.desktop provides javax.print.PrintServiceLookup used by java.desktop
java.desktop provides javax.print.StreamPrintServiceFactory used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiDeviceProvider used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiFileReader used by java.desktop
java.desktop provides javax.sound.midi.spi.MidiFileWriter used by java.desktop
java.desktop provides javax.sound.midi.spi.SoundbankReader used by java.desktop
java.desktop provides javax.sound.sampled.spi.AudioFileReader used by java.desktop
java.desktop provides javax.sound.sampled.spi.AudioFileWriter used by java.desktop
java.desktop provides javax.sound.sampled.spi.FormatConversionProvider used by java.desktop
java.desktop provides javax.sound.sampled.spi.MixerProvider used by java.desktop
java.desktop provides sun.datatransfer.DesktopDatatransferService used by java.datatransfer
This should probably be handled a bit nicer.