1

Issue

I am using AdoptOpenJDK's JRE 11* to run my application. This application uses JavaFX which needs JDK's system module called jdk.unsupported.desktop. This module is not present in mentioned JRE. I was wondering if it is possible to extract this single module from SDK and include it in non-modularized application.

*Adopt is releasing not only JDKs but also JREs

What I've tried

I've built custom JRE including missing module using jlink and it solved my problem. However, I would like to still use pre-built Adopt JRE instead of custom JRE which I need to create by myself.

Question

Is it possible to "extract" one module from JDK and use it in non-modularized application as an application module or regular "3rd party" jar?

Community
  • 1
  • 1
M. Twarog
  • 2,418
  • 3
  • 21
  • 39
  • 1
    What version do you use? Also Javafx has a dependency on `jdk.unsupported.desktop`, but I didn't find a module named `sdk.unsupported.desktop`. Also what is "Adopt JRE 11"? I know about AdoptOpenJDK, which delivers JDK builds, but not JRE builds to my knowledge. – Johannes Kuhn Nov 14 '19 at 12:31
  • I am using JavaFX 13, and AdoptOpenJDK's JRE 11. AdoptOpenJDK is also releasing JRE only. – M. Twarog Nov 14 '19 at 12:39
  • Did not know it also released JREs. Well, jdk.unsupported.desktop uses internal packages from java.desktop. Not sure if you can deliver your own jdk.unsupported.desktop module. – Johannes Kuhn Nov 14 '19 at 12:50
  • 2
    See https://github.com/AdoptOpenJDK/openjdk-build/issues/1065 – Johannes Kuhn Nov 14 '19 at 13:38
  • 1
    Why do you insist on using an outdated and obviously badly configured JRE for a JavaFX application? Did you consider packaging your application with the EA release of jpackage and the most recent version of the JDK which would avoid your current problems? – mipa Nov 14 '19 at 13:52

2 Answers2

1

I'm not aware of any "official" way to convert a platform module to a standalone JAR. But I believe you can just unzip the file jdk-11/jmods/jdk.unsupported.desktop.jmod and repackage it into a JAR file.

  • Copy jdk-11/jmods/jdk.unsupported.desktop.jmod to a temporary file jdk.unsupported.desktop.zip
  • Unzip jdk.unsupported.desktop.zip
  • Zip the classes in the directory jdk.unsupported.desktop/classes to jdk.unsupported.desktop.jar

Now if you put jdk.unsupported.desktop.jar to classpath, it should work with JRE 11.

ZhekaKozlov
  • 36,558
  • 20
  • 126
  • 155
0

I have other question about java.desktop module - if I want to understand deeply the module system and will try for educational purpose only to extract/separate "javax.sound" part of that java.desktop module to create my own javax.sound module to use in javafx application which dont need entire java.desktop module - how to do it? I tried first to recompile module-info.java having expected changes there, but I have no success yet ... yes, I know that its only academic debate as I cant redistribute this probably anywhere, am I right?

modified module-info.java (decompiled by javap) is this: (dont know about imports, I added them and left there also more requires than needed now, but my javac command-line complains still...

import javax.sound.midi.*;
import javax.sound.midi.spi.*;
import javax.sound.sampled.*;
import javax.sound.sampled.spi.*;
import com.sun.media.sound.*;


module javax.sound {
  requires java.base;
  requires java.prefs;
  requires transitive java.datatransfer;
  requires transitive java.xml;

  exports javax.sound.midi;
  exports javax.sound.midi.spi;
  exports javax.sound.sampled;
  exports javax.sound.sampled.spi;

  uses javax.sound.midi.spi.MidiDeviceProvider;
  uses javax.sound.midi.spi.MidiFileReader;
  uses javax.sound.midi.spi.MidiFileWriter;
  uses javax.sound.midi.spi.SoundbankReader;
  uses javax.sound.sampled.spi.AudioFileReader;
  uses javax.sound.sampled.spi.AudioFileWriter;
  uses javax.sound.sampled.spi.FormatConversionProvider;
  uses javax.sound.sampled.spi.MixerProvider;

  provides  javax.sound.midi.spi.MidiDeviceProvider with
    com.sun.media.sound.MidiInDeviceProvider,
    com.sun.media.sound.MidiOutDeviceProvider,
    com.sun.media.sound.RealTimeSequencerProvider,
    com.sun.media.sound.SoftProvider;
  provides  javax.sound.midi.spi.MidiFileReader with
    com.sun.media.sound.StandardMidiFileReader;
  provides  javax.sound.midi.spi.MidiFileWriter with
    com.sun.media.sound.StandardMidiFileWriter;
  provides  javax.sound.midi.spi.SoundbankReader with
    com.sun.media.sound.AudioFileSoundbankReader,
    com.sun.media.sound.DLSSoundbankReader,
    com.sun.media.sound.JARSoundbankReader,
    com.sun.media.sound.SF2SoundbankReader;
  provides  javax.sound.sampled.spi.AudioFileReader with
    com.sun.media.sound.AiffFileReader,
    com.sun.media.sound.AuFileReader,
    com.sun.media.sound.SoftMidiAudioFileReader,
    com.sun.media.sound.WaveFileReader,
    com.sun.media.sound.WaveFloatFileReader,
    com.sun.media.sound.WaveExtensibleFileReader;
  provides  javax.sound.sampled.spi.AudioFileWriter with
    com.sun.media.sound.AiffFileWriter,
    com.sun.media.sound.AuFileWriter,
    com.sun.media.sound.WaveFileWriter,
    com.sun.media.sound.WaveFloatFileWriter;
  provides  javax.sound.sampled.spi.FormatConversionProvider with
    com.sun.media.sound.AlawCodec,
    com.sun.media.sound.AudioFloatFormatConverter,
    com.sun.media.sound.PCMtoPCMCodec,
    com.sun.media.sound.UlawCodec;
  provides  javax.sound.sampled.spi.MixerProvider with
    com.sun.media.sound.DirectAudioDeviceProvider,
    com.sun.media.sound.PortMixerProvider;
}

this dont work yet: javac -p %JAVA_HOME\jmod% module-info.java

module-info.java:1: error: package javax.sound.midi is not visible
import javax.sound.midi.*;
                  ^
  (package javax.sound.midi is declared in the unnamed module, but module javax.sound does not read it)
module-info.java:2: error: package javax.sound.midi.spi is not visible
import javax.sound.midi.spi.*;
                       ^
  (package javax.sound.midi.spi is declared in the unnamed module, but module javax.sound does not read it)
module-info.java:3: error: package javax.sound.sampled is not visible
import javax.sound.sampled.*;
                  ^
  (package javax.sound.sampled is declared in the unnamed module, but module javax.sound does not read it)
module-info.java:4: error: package javax.sound.sampled.spi is not visible
import javax.sound.sampled.spi.*;
falken
  • 41
  • 4
  • well, I somewhat managed to rebuild javax.sound as module from sources, having 2 tiny changes in one deprecated class and one internal reference – falken Mar 14 '21 at 18:57
  • Maybe you should post this as a question which links to this one to get better answers / visibility? – Sorin Mar 14 '21 at 19:12