OpenJFX Пользовательский образ среды выполнения с использованием Maven и jlink - экспорт модулей или аргументы командной строки? - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь создать пользовательский образ времени выполнения, который не требует установленной JRE / JDK на компьютере. Я следовал учебному руководству, представленному в документации OpenJFX (JavaFX и IntelliJ - Modular with Maven), и я могу запустить созданный образ, но я хочу включить для своего приложения класс com.sun.glass.ui.Window (в модуле javafx) .graphics).

Перед пользовательскими изображениями я разбирал в качестве аргументов командной строки следующее: --add-opens javafx.graphics/com.sun.glass.ui=ALL-UNNAMED

Я хочу включить это во время выполнения, поэтому я должен изменить pom из Maven, чтобы включить для javafx-maven-plugin a (не удалось), или я должен отредактировать файл module.info для экспорта запрошенного пакета из javafx.graphics .

Спасибо, Андрей

pom.xml module.info.java

module com.andrei {
    requires javafx.controls;
    requires javafx.graphics;
    exports com.andrei;
    exports com.sun.glass.ui to com.andrei;
}

"Пакет" com.sun.glass.ui "объявлен в модуле" javafx.graphics ", который не экспортируется в модуль" com.andrei ""

1 Ответ

1 голос
/ 05 июня 2019

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, и это будет работать.

...