无法在java 9下针对java 8

时间:2017-10-05 00:17:19

标签: java javafx-8 javac java-9

我正在尝试构建一个应用程序,该应用程序具有使用JavaFX构建的GUI,并使用java 9的新版本标记来定位Java 8。

编译

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版本中构建了相同的应用程序而没有任何问题。

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

我的理解是发布标志的一个目的是消除安装多个JDK版本的需要(或者至少是他们的 rt.jar 文件)。我不确定是不是只想删除编译这个文件的需要,或者意图是删除编译任何JDK打包文件的需要(并且 jfxrt.jar 是包含在JDK8中[至少在Oracle版本中]不需要特殊标志或类路径修改来使用它。)

在不确定意图的情况下,某些东西在java 8下完美编译似乎是错误的但是在java 9下针对java 8需要额外的jar来编译(并且只编译不运行)(但是当针对java 9时则不行) ),因此需要多个JDK。对于那些更熟悉发布标志的预期实现的人来说,这应该是这样的吗?

1 个答案:

答案 0 :(得分:5)

虽然--release标志内部如何解析所需的jdk内部类,但行为似乎很奇怪。但是由于在JDK9中删除了* rt.jars并且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? - 可能想检查任何此类报告的错误。

来自评论: - Java 8中的JavaFX为considered an included extension,因此在定位版本8时无法解析。只有rt.jar文件中的类才会出现已经解决了。