13

好的,我在 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 的 Java 7 Javadoc for Class System是错误的(令人震惊!),它将java.home系统属性描述为“Java 安装目录”。我知道这是因为Java(TM) 系统属性教程将系统属性描述java.home为“Java 运行时环境 (JRE) 的安装目录”。换句话说JAVA_HOME,环境中的 JVM 系统属性不一定相等java.home。(什么设置?!)

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

4

2 回答 2

14

真的是一个 JVM 内部问题

由于 Ant 只是在呼应 java.lang.System 属性(请参阅上面原始帖子下的评论),这确实是一个 JVM 问题。Java HotSpot 虚拟机是核心解释器。代码可在hg.openjdk.java.net在线获得。

在 HotSpot (os_linux.cpp) 的 C++ 代码的第 309 行,该类中有一个init_system_properties_values()方法os。它做了一些温和的启发式方法来嗅出一个名为变量的位置,该变量home_path最终被设置为 Java 用户所看到的“java.home”。代码中的注释表明“<java_home>/jre”被正式指定为“java.home”的 java.lang.System 属性值(在 JDK 安装的情况下)。

于 2013-05-14T03:37:41.220 回答
0

我在 d:\jdk 的 Windows 机器上安装了一个 JDK,但使用 -XshowSettings 运行它的 d:\jdk\bin\java.exe 显示其内置 java.home 指向安装在 c:\ 中的系统范围的 JRE程序文件\Java\jre1.8.0_91。我怀疑我在不了解私有 JRE 与公共 JRE 的角色的情况下删除 d:\jdk\jre 破坏了我的安装。

于 2016-06-19T14:46:08.413 回答