it-swarm.com.ru

Запуск примера 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
7
MohamedSanaulla

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

Это объясняется здесь: http://openjdk.Java.net/jeps/261#Packaging:-JMOD-files :

Файлы 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.

11
José Pereda

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

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

0
Searjasub