【问题标题】:Can not build javafx application under java 9 targeting java 8无法在面向 java 8 的 java 9 下构建 javafx 应用程序
【发布时间】:2017-10-05 00:17:18
【问题描述】:

我正在尝试构建一个应用程序,该应用程序具有使用 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 发行版下构建了相同的应用程序而没有问题。


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

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

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

【问题讨论】:

    标签: java javafx-8 javac java-9


    【解决方案1】:

    尽管--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? -- 可能想要检查任何此类报告的错误。

    来自 cmets:- JavaFX 在 Java 8 中为 considered an included extension,因此在针对版本 8 时未解析。仅解析 rt.jar 文件中的类.

    【讨论】:

    • 如果我将 jfxrt.jar 文件添加到类路径,它会编译(使用 --release 8 标志)。但是,这对我来说似乎不太正确。我的理解是,新的 --release 标志的一个目标是消除安装多个 java 版本的需要(这并不容易与 Window 一起使用),并且编译器将正确处理所有问题。我知道在 8 下编译的任何东西都应该在 9 下编译。我猜是这样,但不是针对 8。我希望它不需要额外的标志,如果它不在 8 中(EE mod 除外)。跨度>
    • 它现在还要求我的构建文件对我的特定系统设置敏感(我正在使用 Gradle 构建真正的应用程序,但从我的问题中删除了这个,因为问题与 Gradle 无关) .这实在是不可取。
    • @Matthew 我建议在 dev-mailing list 上查询这个问题,然后等待官方的回复,以及发布标志的具体实施情况。
    • 我发布到邮件列表,并收到了答复。 JavaFX 被认为是 Java 8 中包含的扩展,因此在针对版本 8 时未解析。仅解析 rt.jar 文件中的类。
    • @Matthew 谢谢,链接到答案的编辑部分。
    猜你喜欢
    • 2019-11-08
    • 2019-02-07
    • 2017-08-10
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2015-05-31
    • 2020-07-27
    相关资源
    最近更新 更多