Ant在哪里设置'java.home'(并且它是错的)并且它应该附加'/ jre'吗?

时间:2013-05-14 00:27:44

标签: java ant centos environment-variables

好的,我在CentOS 6.3上使用Ant版本1.7.1(默认安装):

[theuser@dev-ingyhere ~]$ ant -version
Apache Ant version 1.7.1 compiled on August 24 2010
[theuser@dev-ingyhere ~]$ cat /etc/*-release
CentOS release 6.3 (Final)

我设置JAVA_HOME,然后运行ant

[theuser@dev-ingyhere ~]$ export JAVA_HOME=/usr/java/jdk1.7.0_17 ; echo $JAVA_HOME ;
/usr/java/jdk1.7.0_17
[theuser@dev-ingyhere ~]$ ant -diagnostics | grep java\\.home
java.home : /usr/java/jdk1.7.0_17/jre

这更有趣:

[theuser@dev-ingyhere ~]$ export JAVA_HOME=/a/fools/folly ; echo $JAVA_HOME ; ant -diagnostics | grep java\\.home
/a/fools/folly
java.home : /usr/java/jdk1.7.0_17/jre
[theuser@dev-ingyhere ~]$  env | grep JAVA
JAVA_HOME=/a/fools/folly 

所以,我确实得到了一件事 - 显然Oracle's Java 7 Javadoc for Class System是错误的(骇然!),它将java.home系统属性描述为“Java安装目录”。我知道,因为Java(TM) Tutorials for System Propertiesjava.home系统属性描述为“Java运行时环境(JRE)的安装目录”。换句话说,环境中的JAVA_HOME不一定等于JVM系统属性中的java.home。 (是什么原因?!)

问题:Ant在何处以及如何获取/设置系统属性java.home

2 个答案:

答案 0 :(得分:14)

真的是JVM内部问题

由于Ant只是回显java.lang.System属性(请参阅上面原始帖子中的注释),这实际上是一个JVM问题。 Java HotSpot Virtual Machine是核心解释器。代码可在hg.openjdk.java.net在线获取。

On line 309 of the C++ code for HotSpot (os_linux.cpp) init_system_properties_values()课程中有一个os方法。它有一些温和的启发式方法可以嗅出名为home_path的变量的位置,该变量最终被设置为Java用户称为“java.home”的变量。代码中的注释表明'< java_home> / jre'正式被指定为“java.home”的java.lang.System属性值(在JDK安装的情况下)。

答案 1 :(得分:0)

我在d:\ jdk的Windows机器上安装了JDK,但运行带有-XshowSettings的d:\ jdk \ bin \ java.exe显示其内置的java.home指向系统范围内的JRE安装c:\ Program Files \ Java \ jre1.8.0_91。我怀疑我通过删除d:\ jdk \ jre而不理解私有JRE与公共JRE的角色来破坏我的安装。