在搜索一个JRE来运行我的(基于javafx的)桌面应用程序时,我发现了JRE版本8从这里https://www.java.com/en/download/manual.jsp.这是默认值,这是我在单击Oracle网站上的JRE链接时重定向的地方(https://www.oracle.com/downloads/#category-java)

但是,JRE不支持--module-path显然是因为它太老了.

在非开发人员计算机上运行应用程序有哪些选项?(注意,JRE是60MB,JDK是190MB).

为什么默认的JRE下载太旧了?

我的应用与openjdk编译17.0.9 2023—10—17

推荐答案

t;dr

两家供应商提供了Java 17、21和当前22版本的JDK/JRE产品,并与实现JavaAzul SystemsBellSoft的现代一代OpenJFX库Bundle 在一起.

细节

JavaFXnever是Java的标准部分.

并且要明白,Javascript现在在开源项目OpenJFX中实现了.该项目正在由甲骨文公司和Gluon公司共同领导的持续积极开发中.

几年前,Oracle Select 将JavaFX库与它的一些JDK/JRE产品Bundle 在一起.后来,他们停止了Bundle .

Oracle只是提供JDK/JRE产品的几家供应商之一.关于Java生态系统的解释,请参见Java Is Still Free.

一些JDK/JRE供应商目前 Select 在其产品的某些版本中Bundle 实现为OpenJFX的JavaFX库.我知道至少有两个这样的供应商:

2017年,这Java Platform Module System名成员在Java 9及以后出现.上面列出的供应商为模块化的LTS版本11、17和21以及当前版本(现在是22)提供了JavaFX包.

Javascript 22需要JDK/JRE 17或更高版本.

或者,您可以在应用中Bundle OpenJFX库,也可以在应用中Bundle 一个JRE,并 Select 性地将JRE精简为仅包含应用使用的部分. OpenJDK项目提供工具来帮助:jlinkjpackage.

这项尖端技术使用GraalVM从您的Javascript项目中生成一个原生应用程序.


你问:

但是,JRE不支持模块路径显然是因为它太老了.

Java 9和更高版本的Java平台模块系统(JPMS).关注LTS版本(11,17,21)和当前版本(22),因为other versions已经达到了EOL(生命周期 终止).最新版本的OpenJFX支持Java 17及更高版本.

在非开发人员计算机上运行应用程序有哪些选项?

如果您可以控制用户机器,例如在企业或教育环境中,请考虑让系统管理员安装与必要的OpenJFX库Bundle 在一起的JRE.

在利基市场中,也许您可以要求您的用户安装与OpenJFX库Bundle 的JRE.

在一个广泛的零售市场中,您需要在应用中Bundle JVM和OpenJFX库.应用市场(如Apple App Store)将接受这样的产品.

(注意,JRE是60MB,JDK是190MB).

通过在JPMS模块化项目中使用jlink工具,您可以极大地减小该大小.

为什么默认的JRE下载太旧了?

"为什么"简单地说,Oracle后来决定停止将JavaFX库与他们自己的JDK/JRE产品Bundle 在一起.

但您可以免费将OpenJFX库Bundle 在您的应用程序中.

而且,您可以 Select 从Oracle以外的供应商获得与OpenJFX库Bundle 的最新版本的Java JDK/JRE.您可以获得免费产品以及付费支持的产品.

我的应用与openjdk编译17.0.9 2023—10—17

然后,你可以在编译Java 17时使用OpenJFX 22.

Java相关问答推荐

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

找到允许的最大底片

有关手动创建的包的问题

JavaFX Maven Assembly插件一直打包到错误的JDK版本

CompleteableFuture是否运行在不同的内核上?

GSON期间的Java类型擦除

按属性值从流中筛选出重复项

生成桥方法以解决具有相同擦除的冲突方法

如何让JVM在SIGSEGV崩溃后快速退出?

@Rollback @ Transmission在验收测试中不工作

Lombok@Nonnull是否也对供应商有影响?

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

Quarkus:运行时出现EnumConstantNotPresentException

从泛型枚举创建EnumMap

具有多个模式的DateTimeForMatter的LocalDate.parse失败

每次我需要时创建和关闭数据库连接会有什么效果吗?

为什么项目名称出现在我的GET请求中?

在Spring Boot中使用咖啡因进行缓存

这是JavaFX SceneBuilder的错误吗?

如何在java中从以百分比表示的经过时间和结束日期中找到开始日期