Java Eclipse/Ant 下的编译器默认为 %JAVA_HOME%?

Java compiler under Eclipse/Ant defaults to %JAVA_HOME%?

我最近遇到了一个我需要更好地理解的构建环境行为:

我新安装的工作站概览:

  1. 安装了jdk1.6.0_45,然后是jdk1.7.0_80,然后是jdk1。 8.0_131.
  2. %JAVA_HOME% 设置为 C:\Program Files\Java\jdk1.8.0_131\
  3. 已安装 Eclipse Kepler (4.3.2)
  4. 然后我手动(通过解压缩)添加到 C:\Program Files\Java 以下内容:jdk1.7.0_45, jre1.7.0_76,jre1.7.0_79.
  5. 查看遗留 Ant-based 项目,专为 运行 JRE7 设计。

我的 Eclipse 的 Window > Preferences > Java > Installed JREs 现在看起来:

执行环境是standard(即我没有添加任何):

现在,当我 right-click 项目的 build.xml 和 运行 那个 Ant Build... 我可以看到一个使用 jre7 (jdk1. 7.0_80) 作为默认选择:

所以,当我点击 Apply,然后 运行,它会使用 Java 7 编译器,对吗?

错了。由于某些奇怪的原因,此构建生成的所有 .class 文件的 major_version 为 Java 8!

我通过 brute-forcing Ant 解决了这个问题,通过 build.xml:

使用 Javac 1.7
<property name="ant.build.javac.source" value="1.7"/> 
<property name="ant.build.javac.target" value="1.7"/>

我的问题是:为什么 在 JDK8 下的 Eclipse 运行ning 中构建默认为 JRE8 尽管执行环境设置为 JDK7?

IOW,这是记录在案的功能吗?如果是这样,我在哪里可以了解更多相关信息?


更新:

感谢下面的回答,我试图验证 %JAVA_HOME% 在 Ant 执行中的作用。从外部更改我工作站的 %JAVA_HOME% 系统变量将违背我的设置目的,因此我尝试仅更改 %JAVACMD%。那没有帮助。所以,我在 build.xml:

中回应了相关的环境变量
<target name="jdk_version_validation">
    <echo message="Java Version: ${java.version}" />
    <echo message="Java home: ${java.home}" />
    <echo message="JAVA_HOME: ${env.JAVA_HOME}" />
    <echo message="JAVACMD: ${env.JAVACMD}" />
</target>

这就是我得到的:

jdk_version_validation:
     [echo] Java Version: 1.7.0_80
     [echo] Java home: C:\Program Files\Java\jre7
     [echo] JAVA_HOME: C:\Program Files\Java\jdk1.8.0_131\
     [echo] JAVACMD: C:\Program Files\Java\jdk1.7.0_80\bin

没有上面描述的 brute-force 属性 重写,这仍然会产生 Java 8 class 个文件。太棒了。

您列出的很多东西似乎都是 JRE(不包含 javac 编译器)。所以 Ant 可能会退回到使用 JAVA_HOME.

中列出的 1.8 JDK

您可以尝试使用 JavaSE-1.7 执行环境,实际上 select 您在 'Compatible JREs' 列表中作为默认设置的 JDK。