我正在尝试构建一个应用程序,该应用程序具有使用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。对于那些更熟悉发布标志的预期实现的人来说,这应该是这样的吗?
答案 0 :(得分:5)
虽然--release
标志内部如何解析所需的jdk内部类,但行为似乎很奇怪。但是由于在JDK9中删除了* rt.jars并且javafx.application
是jfxrt.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文件中的类才会出现已经解决了。