无法在 java 9 目标 java 8 下构建 javafx 应用程序

Can not build javafx application under java 9 targeting java 8

我正在尝试构建一个应用程序,该应用程序具有使用 JavaFX 构建的 GUI 并针对 java 8 和 java 9 的新版本标志。

正在编译

import javafx.application.Application;

public class Testing {
    public static void main(String... args) {

    }
}

当目标 java 9 时

javac Testing.java

工作正常(使用 --release 9 时也是如此),但是当我添加发布标志时

javac --release 8 Testing.java

编译失败给出不存在错误

Testing.java:1:error: package javafx.application does not exist

在JDK8 javac下编译没有问题。我试过使用 --add-modules 标志来添加 jfx 模块,但是在将版本设置为 8 时不允许使用该标志。

有没有办法让这个在 java 9 下工作?似乎并不认为 jfx 包包含在 java 8 中,但它们是(至少在 oracle 的版本中)。

我在 Windows 上使用 java 9 的发布版本,并且在最新的 java 8 版本下构建相同的应用程序没有问题。


我尝试从我的 java 8 安装中添加 jfxrt.jar(而不是 rt.jar) 到类路径,同时使用 --release 8 标志编译,它确实有效。

我的理解是发布标志的一个目的是消除安装 JDK 的多个版本的需要(或者至少他们的 rt.jar 文件)。我不确定其目的是仅消除针对这个文件进行编译的需要,还是旨在消除针对任何 JDK 打包文件(和 jfxrt.jar 包含在 JDK8 [至少在 Oracle 的版本中],不需要特殊标志或类路径修改即可使用它。

在不确定意图的情况下,某些东西在 java 8 下可以完美编译但需要额外的 jar 才能在 java 9 目标 java 8(但当目标 java 9 时不是),因此需要多个 JDK。对于任何更熟悉发布标志的预期实现的人,这应该以这种方式工作吗?

尽管就 --release 标志如何在内部解析所需的 jdk 内部 类 而言,该行为似乎很奇怪。但由于 *rt.jars 在 JDK9 中被删除并且 javafx.applicationjfxrt.jar 的一部分,这可能是为什么同样会抱怨缺少包的可能原因。


来自 migration guide 的编译部分详细说明了 --release N 标志在概念上是一个宏:

-source N -target N -bootclasspath $PATH_TO_rt.jar_FOR_RELEASE_N

因此它应该有效,如果你确实尝试这样的事情:

javac -source 8 -target 8 -bootclasspath some/path/to/jdk1.8.0_65.jdk/Contents/Home/jre/lib/rt.jar Testing.java

一个简单的替换上面的解决方案,当然是将jfxrt.jar文件添加到类路径中,然后使用--release 8标志进行编译。


: 还是很疑惑为什么--release找不到以前的版本rt.jar? -- 可能需要检查任何此类报告的错误。

来自评论:- JavaFX 在 Java 8 中是 considered an included extension,因此在定位时未解决版本 8。只有 rt.jar 文件中的 类 得到解析。