Ant在哪里设置了它的'java.home'(它是错误的),它是否应该附加'/jre'?

2022-09-04 20:55:41

好的,我在 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_HOMEant

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

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


答案 1

真的是一个JVM内部问题

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

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


答案 2

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


推荐