Запуск примера javafx на JDK 11 с OpenJFX 11 JMODS на пути к модулю

Я скачал файлы JavaFX Jmod из проекта OpenJFX и поместил их в каталог G:\openjfx\javafx-jmods-11, Я использую OpenJDK 11, который не имеет JavaFX jmod в JAVA_HOME/jmods то есть это не идет с распределением JavaFX.

Информационный файл модуля:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}

Я компилирую со следующим:

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.java src\gui\module-info.java

Компиляция удалась. Но я не могу запустить скомпилированный код с помощью команды ниже:

java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo

Но я получаю следующую ошибку:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found, required by gui

1 ответ

Я считаю, что есть объяснение ошибки, с которой вы сталкиваетесь: jmods не может использоваться во время выполнения.

Это объясняется здесь: http://openjdk.java.net/jeps/261:

Файлы JMOD могут использоваться во время компиляции и во время компоновки, но не во время выполнения. Как правило, для их поддержки во время выполнения мы должны быть готовы извлекать и связывать библиотеки нативного кода на лету.

и кредит идет на этот ответ.

Итак, я сделал несколько простых модулей hellofx:

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

с HelloFX Пример отсюда и скачал jmods для JavaFX 11 для моей платформы отсюда. Я также скачал JavaFX 11 SDK (jars) из того же места.

Время компиляции

Во время компиляции мы можем сделать с помощью jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.java")

или с SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.java")    

В обоих случаях результат точно такой же, как и ожидалось: собственные библиотеки не требуются во время компиляции.

Время выполнения

Теперь мы хотим запустить наш маленький модуль.

С jmods, как указано в OP, работает:

java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX   

не удается с:

Error occurred during initialization of boot layer
  java.lang.module.FindException: Module javafx.controls not found, required by hellofx

Но, используя SDK, работает:

java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX

Время соединения

Как указано в JEP-261, jmods также работают во время соединения, поэтому мы можем использовать jlink инструмент между временем компиляции и временем выполнения.

Вы можете использовать инструмент jlink для сборки и оптимизации набора модулей и их зависимостей в пользовательский образ времени выполнения. ( источник)

Итак, давайте сделаем:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links

это сгенерирует папку с 90,7 МБ (на моем Mac). Обратите внимание, что lib папка содержит все необходимые нативные библиотеки из Java 11 и из JavaFX 11, а также файл размером 70,5 МБ с именем modules,

Время выполнения (2)

И мы наконец можем сделать:

links/bin/java -m hellofx/hellofx.HelloFX

И это будет работать.

В заключение, если мы хотим использовать только jmods для компиляции и запуска наших модулей, нам нужно сделать дополнительный шаг: jlink, В противном случае для выполнения нам понадобится JavaFX SDK.

Если он не добавлен автоматически, попробуйте использовать эту настройку в pom.xml. Обязательно измените "!! ВАШ ГЛАВНЫЙ КЛАСС ИМЯ ЗДЕСЬ!!" ближе к концу кода к названию вашего класса с помощью метода main! Если мой класс - Example.java, я хочу добавить туда просто Пример.

 <dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>11.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>11.0.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

JavaFX не добавляется автоматически как зависимость с Java 11. Поэтому нам нужно добавлять вручную.

Другие вопросы по тегам