it-swarm.com.ru

Упаковка JavaFX: NoClassDefFoundError

Я упаковываю приложение 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.

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

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

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

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

4
tannerli

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

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

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

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

[For] Bionic [...] переместить JRE/JDK по умолчанию в main в OpenJDK 11 in Сентябрь/октябрь 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.

1
tannerli