所以我得到- warning: [options] bootstrap class path not set in conjunction with -source 1.6
我准备问3个问题。我知道我需要设置引导类路径,但我不确定我理解如何。我用谷歌搜索了一下,看到了一些引用Oracle页面的页面,但我读了Oracle页面后,觉得自己并没有很好地理解它。
我目前在Netbeans上运行这个代码,所以我所要做的就是点击播放按钮来编译和运行。是否有一个属性,规定这将如何编译,以便我可以添加在引导类路径?
另外,对于即将到来的可能性,我将把它只在Netbeans上运行,并从命令行运行它,用引导类路径编译的正确方法是什么?题目说的是$ javac -source 6 HelloWorld.java
,但只说-source 1.6
是解吗?
也许一个更大的问题是,我如何在将来避免这种类型的警告?如果我理解一点,我引用的是旧的java源代码,因此是旧的方法。我不确定这是如何或何时发生的。
您正在进行交叉编译。您正在使用JDK 7编译器为JDK 6编译类。这是可以的,但是为了避免问题,编译器想要得到JDK 6 rt.jar
。这背后的原因是,您实际上可能会生成不能与JDK 6一起工作的类,因为您可能使用旧的语言规则(在本例中为1.6),但使用全新的引导类。例如,一些方法在旧的JDK中可能不存在。所以你完成了编译,但是一旦你运行程序,它可能会因为MethodNotFoundException
而崩溃。
有几个解,你可以选一个
- 指定JDK 6中的
rt.jar
。为什么不使用比甚至更老的编译器? - 使用JDK 6编译器(包含
rt.jar
)。如果不需要7个功能,为什么还要使用7个呢? - 忽略警告并进行良好的测试覆盖,以确保您没有使用Java 7的特性
- 我不知道NetBeans,但是在Eclipse中,你也可以说你在编译JDK 6,所以如果你使用Java 7的特性,它实际上不会编译。
- 更改业务需求并编译Java 7
我知道我需要设置引导类路径,但我不确定我理解如何。
在Netbeans 8.0.2中,进入:
Run > Set Project Configuration > Customise...
在类别窗口中,转到:
Build > Compiling
下面的字段是"附加编译器选项",你可以添加:
-bootclasspath /your/path/to/lower/java/version/lib/rt.jar
在macOS的控制台上有相同的警告编译。这里要添加的编译器选项是
-bootclasspath /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar
请注意,在macOS上,对于Java版本<= 1.6(苹果发布的版本),rt.jar
被称为classes.jar
在我的情况下,maven使用的是另一个java版本,我通过在maven中更改所需的java版本来修复它。
只要右键单击项目属性,然后转到绑定,选择JDK 1.7,如果你在NetBeans项目中使用它的功能,这就是你遇到问题的原因。