Упаковка JavaFX: NoClassDefFoundError - PullRequest
0 голосов
/ 11 октября 2018

Я упаковываю приложение JavaFX, используя maven и OpenJDK 1.8. Соответствующая часть из моего pom.xml:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>ui.Main</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

Теперь важно это раньше работало .Я знаю это, потому что я специально сделал git commit, где упаковка наконец-то сработала.Примерно через день и нескольких таких сборок (я не могу понять, что изменилось) я больше не могу запустить jar из-за следующей ошибки:

$ java -jar target/app.jar
Error: Could not find or load main class ui.Main Caused by:
java.lang.NoClassDefFoundError: javafx/application/Application

Когда я просматриваю содержимоеJar, я вижу, что все зависимости специально включены, кроме классов JavaFX.

Что я пробовал:

  • Создайте JAR с помощью javapackager
  • Возьмите с собой javafx-maven-plugin
  • Явно добавьте JavaFX в качестве зависимости в моем pom.xml в надежде, что плагин сборки упакует его для меня

Ни один извыше было успешно.Единственный способ, которым я могу запустить свое приложение, - это непосредственно из IDE, что, по-видимому, означает, что библиотеки JavaFX все еще доступны в моей системе.

Любые идеи о том, какзаставить это работать (снова)?

1 Ответ

0 голосов
/ 18 октября 2018

Короткий ответ

Я запустил флягу с openJDK 11, в то время как JavaFX не создавался при его сборке с openJDK 8. Дело закрыто.

Выводы, подробности и причины

Поскольку моя среда IDE могла без проблем выполнять мой код, я предположил, что проблема связана с моей конфигурацией / машиной.Как выяснилось, Canonical / Ubuntu решили

[For] Bionic [...] переместить JRE / JDK по умолчанию в main на OpenJDK 11 в сентябре / октябре 2018 года какSRU. AskUbuntu

И, как указано в другом потоке SO:

JavaFX 11 больше не является частью JDK StackOverflow

(Это также включает инструкции, как исправить это с помощью JDK 11)

И, наконец, согласно закону Мерфи, я настроил свою упаковкупроект 4-го октября, и решил установить eclipse через apt 8-го октября, который включает в себя openjdk-11-jdk:amd64 (это записано в полезные /var/log/apt/history.log).

Это также обновил мой /etc/alternatives/java чтобы указать на v11.Поскольку я запустил jar без явного указания двоичного файла java, он сломался.

Запуск

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar target/app.jar

для быстрого теста работает, как и ожидалось.Теперь мне нужно только обновить мой проект до openJDK 11, либо всегда запускать мое приложение с определенным JDK 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...