Maven如何知道JAVA_HOME在Ubuntu中被设置为环境变量

6
当我在Ubuntu的终端中输入mvn --version时,我会得到以下输出。
Warning: JAVA_HOME environment variable is not set.
Apache Maven 3.0.5
Maven home: /usr/share/maven
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Default locale: en_IN, platform encoding: UTF-8
OS name: "linux", version: "3.13.0-32-generic", arch: "amd64", family:     "unix"

当我没有设置任何JAVA_HOME环境变量时,Maven如何获取Java安装路径?它是否尝试从我系统中安装的/usr/bin/java命令找到此路径,如果是,为什么它只取到jre路径?
附注:我在任何Maven配置中都找不到任何Java路径。
谢谢。
3个回答

3

如在 CLIReportingUtils.java 中所示(该Maven类用于检索Java Home),该值来自以下调用:

System.getProperty( "java.home", "<unknown java home>" )

java.home是针对JRE的,而JAVA_HOME则是针对JDK的。 因此,Maven显示的是JRE的主目录。


我的问题是,为什么Maven会选择一些Java路径作为JAVA_HOME,而我并没有设置任何内容。这是针对Ubuntu的。 - crackerplace
系统属性仅适用于Java。您不能在操作系统上设置它。您可以在运行命令时设置它(-DpropertyName):https://dev59.com/fmw05IYBdhLWcg3wwEUS#7054981 - Zakaria
好的。但是哪个Java进程设置了这个系统属性,它是如何获取这个路径的? - crackerplace
请转到Java本地实现(用C语言编写):http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/System.java#System.initProperties%28java.util.Properties%29。当安装Java时,操作系统会将java.home传递给Java。 - Zakaria

1
我认为 JAVA_HOME 环境变量和输出的 Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre 之间存在差异。后者只是安装目录的输出 请看这里
因此,Maven 将在后台运行 Java,并且 Java 知道它安装在哪里。

是的,我的意思是Maven将这个Java位置视为自己的JAVA_HOME,因此它会在mvn --version中打印出来。 - crackerplace
1
正如@Zakaria所发的,Maven只读取java.home属性,默认情况下为安装目录。 System.out.println(System.getProperty(“java.home”))始终是安装目录,System.out.println(System.getenv(“JAVA_HOME”))是环境变量的值。 - hinneLinks
谢谢你的回答。在选择你和Zakaria的答案时有些困惑,最终还是选择了Zakaria的答案,因为他提供了源代码链接。 - crackerplace

0
我认为,我现在明白了。在maven脚本即(usr/share/maven/bin/mvn)中,他们正在尝试使用各种选项查找已安装的java。
因此,在一个地方,他们正在执行以下操作:
JAVACMD="`which java`"

现在在我的系统中,“which java”指向以下位置

java -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java

希望这就是获取Java路径的方法。


很抱歉要坚持,但正如我在我的答案中指出的那样,您可以在Maven源代码中看到Maven命令正在调用以下指令:System.getProperty("java.home", "<unknown java home>") - Zakaria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接