Я работаю над переносом своего приложения Maven JavaFX с Java 8 на Java 11. Я обновил плагины в моем pom.xml до самых последних (совместимых с Java 11) плагинов. Компиляция проходит нормально, предоставляя мне файлы jar и все зависимости и модули в правильных каталогах в «целевой» папке, но когда я пытаюсь запустить файл jar, я получаю ужасную ошибку «Отсутствует класс приложения JavaFX». Независимо от того, как я пытаюсь изменить конфигурацию плагина, я всегда получаю сообщение об ошибке, и приложение не запускается.
Теперь еще выводы: 1. Основной класс ДЕЙСТВИТЕЛЬНО находится в правильной папке под классами и в банке. 2. Файл манифеста находится в нужном месте и содержит атрибут основного класса (который отлично работал в Java 8).
Вот соответствующая часть
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source>
<release>11</release>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
<compilerVersion>11</compilerVersion>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>false</addClasspath>
<mainClass>${mainClass}</mainClass>
</manifest>
<manifestEntries>
<JavaFX-Application-Class>${mainClass}</JavaFX-Application-Class>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-libs</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<includeScope>runtime</includeScope>
<excludeGroupIds>org.openjfx</excludeGroupIds>
</configuration>
</execution>
<execution>
<id>copy-modules</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/mods</outputDirectory>
<includeScope>runtime</includeScope>
<includeGroupIds>org.openjfx</includeGroupIds>
</configuration>
</execution>
</executions>
Я запускаю банку, включая модули JavaFX, как описано в документации:
java -verbose --module-path ../mods \
--add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.swing \
-jar jar-file-name.jar \
package.class.MainClass
В своем разочаровании я пробовал бесконечное количество конфигураций, в том числе использовал конфигурацию из примеров JavaFx Java 11. Ничего не работает.
Любые идеи?
это известная ошибка. bugs.openjdk.java.net/browse/…
@nullpointer - Да, я следил за документацией. Я попытался использовать файл pom.xml из этого примера, но это не помогло.
@MebinJoe - спасибо.
Ваш pom с HelloFX образец отлично работает для меня с вашей командой командной строки.
Образец представляет собой проект одного класса. Реальные приложения гораздо сложнее. Я ищу способ найти, что не так со сборкой и как это исправить. Какие-либо предложения ?




Я нашел обходной путь в https://github.com/javafxports/openjdk-jfx/issues/236.
Этот обходной путь включает создание нового обычного класса (не Java Fx), который будет основным классом Jar, и этот класс запустит исходный класс приложения на основе JavaFx.
Это новый класс из ссылки, где я нашел обходной путь:
public class Main {
public static void main(String[] args) {
HelloFX.main(args);
}
}
Надеюсь, это поможет кому-то. Я не отмечаю этот ответ как правильный из-за того, что это обходной путь, а не реальное решение.
Обновлено: оказывается, обходной путь описан в документации JavaFX здесь: https://openjfx.io/openjfx-docs/#modular
As explained here, in order to create a runnable jar with all the required JavaFX dependencies, you will need to use a launcher class that doesn't extend from Application.
Это немного сумасшедшее решение, с которым я пошел. Запуск в Intellij дал мне тревожное сообщение: «Ошибка: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения». Похоже, в вашей системе отсутствует что-то фундаментальное. Затем вы просто создаете другой класс с основным методом, который просто вызывает основной метод исходного класса, и это работает! Какая глупая ситуация, но спасибо за решение.
Вы пытались следовать документация?