Запуск примера 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. Поэтому нам нужно добавлять вручную.