Мое приложение не является приложением 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
Я хотел бы, чтобы пользователи не были (слишком много) манипулирования, чтобы начать приложение.
Итак, мои вопросы:
Спасибо.
Вы пытаетесь запустить JavaFX 11, который собирается с использованием Java 11+ (файл класса версии 54.0+, если я правильно помню) во время выполнения Java 8 (который поддерживает только файл класса версии 52.0).
Вам необходимо либо перейти на более свежую версию Java, я бы порекомендовал следующее:
Я бы также порекомендовал использовать как последнюю версию Java, так и JavaFX (16 была только что выпущена).
Или вы выбираете дистрибутив Java 8 с JavaFX в комплекте с:
Неизбежны манипуляции с настройками на Linux (e. g. JAVA_HOME, ... ) и каждый пользователь Linux знаком с этим, так что я не должен беспокоиться об этом ?
Этого можно избежать:
javapackager
, которая содержится в JDK. В результате появится каталог, содержащий исполняемый файл и требуемое время выполнения. Пользователям ничего не нужно устанавливать. jpackage
(вторая была удалена и поэтому заменена на эту). Это может сделать в основном то же самое, но в сочетании с модульной системой Java 9+. Ссылки:
Есть ли какой-нибудь способ связать JavaFx в мою .jar, зная, что я ограничен JRE 1.8
Не с JavaFX 11 и более поздними версиями. Но вы все равно можете сделать это с Java 8 вариантом от BellSoft.
Но почему вы ограничены Java 8?
Должен ли я упаковать свое приложение с другими вещами, как предложено в следующем посте: Как обеспечить установку JavaFX (особенно на Ubuntu)?
Нет... Я имею в виду, не обязательно. Это зависит от того, что вы хотите.
Я бы использовал более свежую версию и воспользовался бы дорогой GraalVM (которая самая трудная, но выполнимая, как только вы настроите сборку и запустите ее).
Btw: инструменты javapackager
или jpackage
способны создавать .deb
s или .rpm
s.
#edit: Обновлены ссылки и описания, в качестве опции добавлен Zulu OpenJDK.