我多年来一直在使用eclipse,但这种情况从未发生过。我在我的系统上安装了JDK7,并将其用作工作空间JRE。但是,当我在maven项目中包含以下定义时,库部分将java库显示为[JavaSE 1.6],如下图所示。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
我理解源和目标配置的概念。但是,我只是不了解JDK7库作为JRE6的方式(或者是吗?)。谁能解释一下?
我正在使用Eclipse Mars和JDK 1.7作为工作台JRE
答案 0 :(得分:0)
答案 1 :(得分:0)
在将配置设置为较旧的JRE而不是用于构建的JRE时,无法防止使用错误的API。
来自manual
注意:仅仅设置目标选项并不能保证您的代码实际上在具有指定版本的JRE上运行。缺陷是无意中使用的API,这些API仅存在于以后的JRE中,这会使您的代码在运行时因链接错误而失败。要避免此问题,您可以配置编译器的引导类路径以匹配目标JRE,或使用Animal Sniffer Maven插件验证您的代码是否使用了非预期的API。
但要回答你的问题:
但是,我只是不了解JDK7库作为JRE6的方式。谁能解释一下?
它没有,至少不是真的。例如,如果您已经(仅)安装了JRE 8,但是您的项目设置为JRE 7,则可以编写此行代码而不会出现编译错误,因为它是合法的JRE 7 Java,只需使用添加的方法(join
) JRE 8的运行时间。
String join = String.join("", "a", "b");
当您使用JRE 7运行它时,您将在运行时获得此信息:
Exception in thread "main" java.lang.NoSuchMethodError: java.lang.String.join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;
at snippet.Snippet.main(Snippet.java:5)
因此,如果您确实希望确保合规性,请在系统上安装正确的JRE进行构建和开发。