javafx-maven-plugin
должен иметь возможность делать то, что вы пытаетесь сделать.Тем не менее, пока он этого не делает, поэтому я только что подал эти две проблемы: Параметры для javafx: run несовместимы с javafx: jlink и Параметр параметров отсутствующей ссылки vm .
Пока это решается и публикуется новая версия, есть простое (но ручное) исправление:
Время компиляции
Перед изменениемjavafx-maven-plugin
, вам нужно разрешить вашей IDE работать с приватным пакетом.Вы не можете сделать это из информации модуля, но вы можете легко сделать это из maven-compiler-plugin
, используя compilerArgs
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerArgs>
<arg>--add-exports</arg>
<arg>javafx.graphics/com.sun.glass.ui=com.andrei</arg>
</compilerArgs>
</configuration>
</plugin>
Теперь в вашем коде вы можете использовать этот закрытый пакет,и IntelliJ не будет жаловаться.
После запуска из окна Maven Lifecycle -> clean
и Lifecycle -> compile
в редакторе допускается что-то подобное:
@Override
public void start(Stage stage) throws Exception {
...
stage.setScene(scene);
stage.show();
com.sun.glass.ui.Window.getWindows().forEach(System.out::println);
}
Время выполнения
Однако, если вы сделаете mvn clean compile javafx:run
, приведенный выше код завершится ошибкой:
Причина: java.lang.IllegalAccessError: класс com.andrei.Main (в модуле com.andrei) не может получить доступкласс com.sun.glass.ui.Window (в модуле javafx.graphics), поскольку модуль javafx.graphics не экспортирует com.sun.glass.ui в модуль com.andrei.
Как описано вплагин readme , вы можете добавить параметры виртуальной машины, которые будут переданы в инструмент java
:
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<options>
<option>--add-opens</option>
<option>javafx.graphics/com.sun.glass.ui=com.andrei</option>
</options>
...
</configuration>
</plugin>
Теперь вы можете запустить: mvn clean compile javafx:run
, и это будет работать, иВы получите распечатанную информацию о текущем этапе.
Образ времени выполнения
Наконец, если вы запустите: mvn clean compile javafx:jlink
, произойдет сбой, поскольку содержимое в <options>
не распознается jlink
(первая проблема подана), поэтому вы должны закомментировать его:
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<!--<options>-->
<!--<option>--add-opens</option>-->
<!--<option>javafx.graphics/com.sun.glass.ui=com.andrei</option>-->
<!--</options>-->
<launcher>launcher</launcher>
<mainClass>com.andrei/com.andrei.Main</mainClass>
...
</configuration>
</plugin>
Теперь mvn clean compile javafx:jlink
будет работать, но при запускеg вы получите ту же ошибку, что и выше, потому что личный пакет не экспортируется.
Однако вы можете отредактировать файл запуска под target/image/bin/launcher
:
#!/bin/sh
JLINK_VM_OPTIONS=
DIR=`dirname $0`
$DIR/java $JLINK_VM_OPTIONS -m com.andrei/com.andrei.Main $@
Как видите,есть пустая переменная JLINK_VM_OPTIONS
, которую можно заполнить параметрами vm.
Пока не решена вторая проблема, просто измените эту строку:
#!/bin/sh
JLINK_VM_OPTIONS="--add-opens javafx.graphics/com.sun.glass.ui=com.andrei"
DIR=`dirname $0`
$DIR/java $JLINK_VM_OPTIONS -m fx/org.openjfx.MainApp $@
сохраните и запустите: target/image/bin/launcher
, и это будет работать.