Java Eclipse/Ant 下的编译器默认为 %JAVA_HOME%?
Java compiler under Eclipse/Ant defaults to %JAVA_HOME%?
我最近遇到了一个我需要更好地理解的构建环境行为:
我新安装的工作站概览:
- 安装了jdk1.6.0_45,然后是jdk1.7.0_80,然后是jdk1。 8.0_131.
- %JAVA_HOME% 设置为
C:\Program Files\Java\jdk1.8.0_131\
- 已安装 Eclipse Kepler (4.3.2)
- 然后我手动(通过解压缩)添加到
C:\Program Files\Java
以下内容:jdk1.7.0_45, jre1.7.0_76,jre1.7.0_79.
- 查看遗留 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。
我最近遇到了一个我需要更好地理解的构建环境行为:
我新安装的工作站概览:
- 安装了jdk1.6.0_45,然后是jdk1.7.0_80,然后是jdk1。 8.0_131.
- %JAVA_HOME% 设置为
C:\Program Files\Java\jdk1.8.0_131\
- 已安装 Eclipse Kepler (4.3.2)
- 然后我手动(通过解压缩)添加到
C:\Program Files\Java
以下内容:jdk1.7.0_45, jre1.7.0_76,jre1.7.0_79. - 查看遗留 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.
您可以尝试使用 JavaSE-1.7 执行环境,实际上 select 您在 'Compatible JREs' 列表中作为默认设置的 JDK。