java.lang.noclassdeffoundError: javafx / приложение / платформа, несмотря на Javafx, добавленные в виде зависимости Maven

Мое приложение не является приложением JavaFX, а использует некоторые библиотеки JavaFX (JavafX Media).

Следующий код работает нормально под Windows. Но не Ubuntu:

static void initJavaFx() {
    try {
        logger.debug("Checking JavaFx");
        // dummy to test if JavaFx is avaialble
        Platform.runLater(() -> { // <-- THE ONE CAUSING THE ERROR
        });
        synchronized (lock) {
            javafxloaded = true;
        }
        logger.debug("Check JavaFx ok");
    } catch (Exception e) {
        logger.debug("Check JavaFx fail");
        // if exception it means JavaFx is not laoded => loading it and waitng it to be loaded.
        final CountDownLatch latch = new CountDownLatch(1);
        logger.debug("Initializing JavaFx");
        new JFXPanel(); // initializes JavaFX environment
        logger.debug("Initializion JavaFx done");
        latch.countDown();
}

JRE является «среда выполнения OpenJDK) (Build 1.8.0_282-8U282-B08-0UBuntu1 ~ 18.04-B08)» (Я ограничен 1,8 из-за некоторых внешних библиотек, используя WindowsLaf).

Я думал, что смогу решить, что, включая Javafx с Maven,

<dependency><!-- On force JavaFx car OpenJdk ne le prend plus par défaut-->
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-media</artifactId>
    <version>11</version>
</dependency>

, но тогда я получил следующую ошибку:

java.lang.UnsupportedClassVersionError: javafx/application/Platform has been compiled by a more recent version of the Java Runtime (class file version 54.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Я хотел бы, чтобы пользователи не были (слишком много) манипулирования, чтобы начать приложение.

Итак, мои вопросы:

  • - это манипуляция настроек неизбежно на Linux (например, java_home, ...), и каждый пользователей Linux знаком с этим, поэтому я не беспокоюсь об этом?
  • Есть ли Способ подключить Javafx в моем .jar, зная, что я ограничен JRE 1.8
  • Должен ли я упаковать свое приложение с другими такими веществами, как предложено в следующем посте: Как гарантировать, что Javafx установлен (espacially на Ubuntu) ?

Спасибо.

0
задан 16 March 2021 в 17:38

1 ответ

Вы пытаетесь запустить JavaFX 11, который собирается с использованием Java 11+ (файл класса версии 54.0+, если я правильно помню) во время выполнения Java 8 (который поддерживает только файл класса версии 52.0).

Вам необходимо либо перейти на более свежую версию Java, я бы порекомендовал следующее:

  • AdoptOpenJDK (не входит в пакет JavaFX, нужна зависимость от Maven)
  • BellSoft (выберите Full JDK, затем #JavaFX даже входит в него, зависимость Maven не нужна)
  • Zulu OpenJDK (также поддерживает JavaFX в комплекте)

Я бы также порекомендовал использовать как последнюю версию Java, так и JavaFX (16 была только что выпущена).

Или вы выбираете дистрибутив Java 8 с JavaFX в комплекте с:

  • опять же Bell Soft имеет что-то
  • Zulu OpenJDK также имеет Java 8 LTS версию с JavaFX и без

Неизбежны манипуляции с настройками на Linux (e. g. JAVA_HOME, ... ) и каждый пользователь Linux знаком с этим, так что я не должен беспокоиться об этом ?

Этого можно избежать:

  • С помощью Java 8 вы можете создать "приложение" из своего кода с помощью утилиты javapackager, которая содержится в JDK. В результате появится каталог, содержащий исполняемый файл и требуемое время выполнения. Пользователям ничего не нужно устанавливать.
  • С Java 14+ у вас есть утилита jpackage (вторая была удалена и поэтому заменена на эту). Это может сделать в основном то же самое, но в сочетании с модульной системой Java 9+.
  • С помощью GraalVM 21 (вариант Java11) можно даже создать один исполняемый файл из своего кода. Никакого JVM, никакого исполнения, только один (довольно большой) файл - может быть скомпилирован кросс-компилирован под Linux, Windows, Mac, Android, iOS.

Ссылки:

Есть ли какой-нибудь способ связать JavaFx в мою .jar, зная, что я ограничен JRE 1.8

Не с JavaFX 11 и более поздними версиями. Но вы все равно можете сделать это с Java 8 вариантом от BellSoft.

Но почему вы ограничены Java 8?

Должен ли я упаковать свое приложение с другими вещами, как предложено в следующем посте: Как обеспечить установку JavaFX (особенно на Ubuntu)?

Нет... Я имею в виду, не обязательно. Это зависит от того, что вы хотите.

Я бы использовал более свежую версию и воспользовался бы дорогой GraalVM (которая самая трудная, но выполнимая, как только вы настроите сборку и запустите ее).

Btw: инструменты javapackager или jpackage способны создавать .debs или .rpm s.


#edit: Обновлены ссылки и описания, в качестве опции добавлен Zulu OpenJDK.

0
ответ дан 18 March 2021 в 23:25

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

Похожие вопросы: