Проект Maven JavaFx компилируется, но при запуске из консоли выдается сообщение об ошибке «Отсутствует класс приложения 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>

Я запускаю банку, включая модули 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. Ничего не работает.

Любые идеи?

Вы пытались следовать документация?

Naman 25.02.2019 09:21

это известная ошибка. bugs.openjdk.java.net/browse/…

Mebin Joe 25.02.2019 09:22

@nullpointer - Да, я следил за документацией. Я попытался использовать файл pom.xml из этого примера, но это не помогло.

FunkSoulBrother 25.02.2019 09:40

@MebinJoe - спасибо.

FunkSoulBrother 25.02.2019 09:45

Ваш pom с HelloFX образец отлично работает для меня с вашей командой командной строки.

José Pereda 25.02.2019 10:24

Образец представляет собой проект одного класса. Реальные приложения гораздо сложнее. Я ищу способ найти, что не так со сборкой и как это исправить. Какие-либо предложения ?

FunkSoulBrother 06.03.2019 12:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
1 181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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 отсутствуют и необходимы для запуска этого приложения». Похоже, в вашей системе отсутствует что-то фундаментальное. Затем вы просто создаете другой класс с основным методом, который просто вызывает основной метод исходного класса, и это работает! Какая глупая ситуация, но спасибо за решение.

davidfrancis 27.07.2020 13:23

Другие вопросы по теме