我的应用程序不是 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 运行时环境(构建 1.8.0_282-8u282-b08-0ubuntu1~18.04-b08)”(由于一些使用 WindowsLaf 的外部库,我仅限于 1.8)。
我认为可以通过将 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 已安装(尤其是在 Ubuntu 上)?
谢谢。
答案1
您正在尝试运行 JavaFX 11,它是使用 Java 11+(如果我没记错的话,类文件版本 54.0+)和 Java 8 运行时(仅支持类文件版本 52.0)构建的。
您要么需要切换到较新的 Java 版本,我建议您执行以下操作:
- AdoptOpenJDK(无需捆绑 JavaFX、Maven 依赖)
- 贝尔软件(选择完整 JDK,那么 #JavaFX 就是其中的一部分,不需要 Maven 依赖)
- 祖鲁 OpenJDK(还支持捆绑的 JavaFX)
我还建议使用最新的 Java 和 JavaFX 版本(16 刚刚发布)。
或者,您可以选择捆绑了 JavaFX 的 Java 8 发行版:
- Bell Soft 再次某物
- Zulu OpenJDK 还具有Java 8 LTS带有和不带有 JavaFX 的版本
在 Linux 上是否不可避免地需要操作设置(例如 JAVA_HOME,...)并且每个 Linux 用户都熟悉这一点,所以我不用担心它?
这是可以避免的:
- 使用 Java 8,您可以使用 JDK 中包含的实用程序从代码中创建一个“应用程序”
javapackager
。结果是一个包含可执行文件和所需完整运行时的目录。用户无需安装任何东西。 - 使用 Java 14+ 你就可以使用这个
jpackage
工具了(另一个工具已被删除,因此被这个工具取代)。它基本上可以做同样的事情,但要与 Java 9+ 模块系统结合使用。 - 使用 GraalVM 21(Java11 变体),您甚至可以从代码中创建单个可执行文件。没有 JVM,没有运行时,只有一个(相当大的)文件 - 可以在 Linux、Windows、Mac、Android、iOS 上进行交叉编译。
链接:
有没有办法将 JavaFx 捆绑在我的 .jar 中,因为我只限于 JRE 1.8
JavaFX 11 及更高版本不支持。但您仍然可以使用 BellSoft 的 Java 8 变体来实现。
但为什么你仅限于 Java 8 吗?
我是否应该将我的应用程序与其他内容一起打包,如以下帖子中所建议的:如何确保安装了 JavaFX(尤其是在 Ubuntu 上)?
不...我的意思是不一定。这取决于什么你想。
ID使用较新的版本并使用 GraalVM 路线(这是最难的,但可行,只要您设置并运行了构建)。
顺便说一句:javapackager
或jpackage
工具能够创建.deb
s 或.rpm
s。
#编辑:更新链接和描述,添加 Zulu OpenJDK 作为选项。