Проект JavaFx Maven компилируется, но запускается из консоли и выдает ошибку «Отсутствует класс приложения JavaFX». - PullRequest
0 голосов
/ 25 февраля 2019

Я работаю над переносом моего приложения Maven JavaFX с Java 8 на Java 11. Iv'e обновил плагины в моем pom.xml до самых последних (совместимых с Java 11) плагинов.Компиляция работает нормально, давая мне файлы jar и все зависимости и модули в нужных каталогах в папке «target», но когда я пытаюсь запустить файл jar, я получаю страшную ошибку «Missing JavaFX application class».Независимо от того, как я пытаюсь изменить конфигурацию плагина - я всегда получаю сообщение об ошибке, и приложение не запускается.

Теперь, больше выводов: 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>

Я запускаю jar, включая модули JavaFX, как описано в документации:

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.Ничего не работает

Есть идеи?

1 Ответ

0 голосов
/ 08 марта 2019

Я нашел обходной путь на https://github.com/javafxports/openjdk-jfx/issues/236.

Этот обходной путь включает создание нового, обычного (не Java Fx) класса, который будет основным классом Jar, и этот класс запустит оригинальное приложение на основе JavaFx.class.

Это новый класс по ссылке, где я нашел обходной путь:

public class Main {

    public static void main(String[] args) {
        HelloFX.main(args);
    }
}

Надеюсь, это кому-нибудь поможет.Я не отмечаю этот ответ как правильный из-за того, что это обходной путь, а не реальное решение.

РЕДАКТИРОВАТЬ: оказывается, что обходной путь, описанный в документации JavaFX здесь: https://openjfx.io/openjfx-docs/#modular

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

...