Проект Maven JavaFx компилируется, но при запуске с консоли выдает сообщение об ошибке класса приложения Missing JavaFX

Я работаю над переносом моего приложения 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>

I'm running the jar by including the JavaFX modules as described in the documentation :

java -verbose --module-path ../mods \
    --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.swing \
     -jar jar-file-name.jar \
     package.class.MainClass

В своем разочаровании Iv'e пробовал бесконечные конфигурации, в том числе с использованием конфигурации из примеров JavaFx Java 11. Ничего не работает.

Любые идеи?


person FunkSoulBrother    schedule 25.02.2019    source источник
comment
Вы пытались следовать документации?   -  person Naman    schedule 25.02.2019
comment
это известная ошибка. bugs.openjdk.java.net/browse/   -  person Mebin Joe    schedule 25.02.2019
comment
@nullpointer - Да, я следил за документацией. Я попытался использовать файл pom.xml из этого примера, но это не помогло.   -  person FunkSoulBrother    schedule 25.02.2019
comment
@MebinJoe - спасибо.   -  person FunkSoulBrother    schedule 25.02.2019
comment
Ваш pom с образец HelloFX работает нормально для меня с помощью вашей команды командной строки.   -  person José Pereda    schedule 25.02.2019
comment
Образец представляет собой одноклассный проект. Приложения из реальной жизни намного сложнее. Ищу способ найти, что не так со сборкой и как это исправить. Какие-либо предложения ?   -  person FunkSoulBrother    schedule 06.03.2019


Ответы (1)


Я нашел обходной путь на странице 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

Как объясняется здесь, для создания исполняемого jar-файла со всеми необходимыми зависимостями JavaFX вам нужно будет использовать класс запуска, который не является наследником Application.

person FunkSoulBrother    schedule 08.03.2019
comment
Это немного помешанное решение, которое я выбрал. Запуск в Intellij дал мне тревожное сообщение: Ошибка: компоненты среды выполнения JavaFX отсутствуют и необходимы для запуска этого приложения. Похоже, в вашей системе не хватает чего-то фундаментального. Затем вы просто создаете другой класс с основным методом, который просто вызывает основной метод исходного класса, и он работает! Какая глупая ситуация, но спасибо за решение. - person davidfrancis; 27.07.2020