Eclipse/Ant下的Java编译器默认为%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 FilesJavajdk1.8.0_131
- 已安装 Eclipse Kepler (4.3.2)
- 然后我手动(通过解压缩)将以下内容添加到
C:Program FilesJava
:jdk1.7.0_45, jre1.7.0_76, jre1.7.0_79. - 检查了一个旧的基于 Ant 的项目,该项目旨在仅在 JRE7 下运行.
My Eclipse 的 Window >首选项 >爪哇>已安装的 JRE
现在看起来:
执行环境是
现在,当我右键单击项目的 build.xml
并运行该 Ant Build 时...我可以看到一个使用 jre7
(jdk1.xml) 的执行环境.7.0_80) 作为其默认值,被选中:
所以,当我点击 Apply 和 Run 时,它会使用 Java 7 编译器,对吧?
错了.出于某种奇怪的原因,此构建生成的所有 .class
文件都有一个 Java 8 的主要版本!
我通过 build.xml 强制 Ant 使用 Javac 1.7 解决了这个问题:
<property name="ant.build.javac.target" value="1.7"/>
我的问题是:为什么在 JDK8 下运行的 Eclipse 构建会默认为 JRE8尽管执行环境设置为 JDK7?
IOW,这是记录在案的功能吗?如果是这样,我可以在哪里了解更多相关信息?
<小时>更新:
感谢下面的回答,我尝试验证了 %JAVA_HOME% 在 Ant 执行中的作用.从外部更改我工作站的 %JAVA_HOME% 系统变量会违背我的设置目的,所以我尝试更改 仅限 %JAVACMD%.那没有帮助.所以,我在我的 build.xml
中回显了相关的环境变量:
<echo message="Java 版本:${java.version}"/><echo message="Java home: ${java.home}"/><echo message="JAVA_HOME: ${env.JAVA_HOME}"/><echo message="JAVACMD: ${env.JAVACMD}"/></目标>
这就是我得到的:
jdk_version_validation:[echo] Java 版本:1.7.0_80[echo] Java 主页:C:Program FilesJavajre7[echo] JAVA_HOME: C:Program FilesJavajdk1.8.0_131[echo] JAVACMD: C:Program FilesJavajdk1.7.0_80in
如果没有上面描述的蛮力属性覆盖,这仍然会生成 Java 8 类文件.太棒了.
您列出的许多内容似乎都是 JRE(不包含 javac
编译器).因此,Ant 可能会重新使用 JAVA_HOME 中列出的 1.8 JDK.
您可以尝试使用 JavaSE-1.7 执行环境,并在兼容 JRE"列表中选择您拥有的默认 JDK.
I recently encountered a build environment behavior that I need to better understand:
Overview of my freshly installed workstation:
- Installed jdk1.6.0_45, then jdk1.7.0_80, then jdk1.8.0_131.
- %JAVA_HOME% is set to
C:Program FilesJavajdk1.8.0_131
- Installed Eclipse Kepler (4.3.2)
- I then manually (by way of unzipping) added to
C:Program FilesJava
the following: jdk1.7.0_45, jre1.7.0_76, jre1.7.0_79. - Checked out a legacy Ant-based project, designed to run under JRE7 only.
My Eclipse's Window > Preferences > Java > Installed JREs
now looks:
Execution environments are standard (i.e. I have not added any):
Now, when I right-click the project's build.xml
and run that Ant Build... I can see that an execution environment that uses jre7
(jdk1.7.0_80) as its default, is selected:
So, when I click Apply, then Run, it will use a Java 7 compiler, right?
Wrong. For some strange reason, all .class
files generated by this build have a major_version of Java 8!
I solved this problem by brute-forcing Ant to use Javac 1.7, via build.xml:
<property name="ant.build.javac.source" value="1.7"/>
<property name="ant.build.javac.target" value="1.7"/>
My question is: Why would a build in Eclipse running under JDK8 default to JRE8 despite Execution Environment set to JDK7?
IOW, is this a documented feature? If so, where can I learn more about this?
Update:
Thanks to the answer below, I tried to verify the role of %JAVA_HOME% in Ant's execution. Externally changing my workstation's %JAVA_HOME% system variable would be defeating the purpose of my setup, so I tried changing %JAVACMD% only. That didn't help. So, I echoed relevant env vars in my 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>
and this is what I got:
jdk_version_validation:
[echo] Java Version: 1.7.0_80
[echo] Java home: C:Program FilesJavajre7
[echo] JAVA_HOME: C:Program FilesJavajdk1.8.0_131
[echo] JAVACMD: C:Program FilesJavajdk1.7.0_80in
Without the brute-force property overriding described above, this still produces Java 8 class files. Amazing.
A lot of those things you list appear to be JREs (which don't contain a javac
compiler). So Ant is probably falling back on using the 1.8 JDK listed in JAVA_HOME.
You could try using the JavaSE-1.7 Execution Evironment and actually select the one JDK you have as the default in the 'Compatible JREs' list.
这篇关于Eclipse/Ant下的Java编译器默认为%JAVA_HOME%?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!