43

当我跑的时候mvn -version,我注意到了java_home...jdk\jre如下图)。那是错的吗?它不应该指向...\jdk.x.y.z(没有\jre)吗?如果是这样,我该如何重置它?(在全局%java_home%指向jdk目录)

C:\Users\Owner>mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-06 15:16:01-0400)
Java version: 1.7.0_17
Java home: C:\Program Files\Java\jdk1.7.0_17\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7" version: "6.1" arch: "amd64" Family: "windows"
4

2 回答 2

71

不,这没有错。它指向您的 JDK 使用的 JRE,这是它应该做的。如果您JAVA_HOME在 Maven 外部打印,它应该可以正确打印:

C:\>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.7.0_07

C:\>mvn -version
Apache Maven 3.0.4 (r1232337; 2012-01-17 10:44:56+0200)
Maven home: C:\APPS\apache-maven-3.0.4\bin\..
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_07\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
C:\>

所以基本上 JAVA_HOME 需要指向一个 JDK 安装(maven 需要 tools.jar),但 maven 实际上使用 JDK 中的 jre 来运行自己。

使用时,maven 使用 java 内部 java.home 属性,从源代码mvn -version可以看出:

version.append( "Java home: " + System.getProperty( "java.home", "<unknown java home>" ) ).append( LS );

此属性与 JAVA_HOME 环境设置不同,因此可能会欺骗您。它实际上是动态属性,向您显示哪个 JRE 正在运行您的代码。如果你编译并执行一个Test.java测试类打印同样的,你可以看到如果你的JAVA_HOME指向一个JDK,java.home的值不等于你的JAVA_HOME。这是意料之中的。

引用这个

JAVA_HOME 和 java.home 有什么区别?

JAVA_HOME 是JDK 安装目录,例如C:\jdk5。它旨在设置为环境变量并在 Windows 批处理文件或 Unix 脚本中引用。我总是在我的 Windows 控制面板和 .tcsh 文件中拥有它,以及其他常见的环境变量。一些 Java 应用程序为此使用名称 jdk.home,我认为这是一个更好的名称。但是 JAVA_HOME 从一开始就被使用,现在是一个约定。

java.home 是 JRE 安装目录,例如 C:\jdk5\jre 或 C:\Program Files\Java\jre1.5.0_06。与 JAVA_HOME 不同,我从未将 java.home 视为环境变量。java.home 是一个内置的 Java 系统属性,其值为 JRE 安装目录。由于所有 Java 系统属性也作为 Ant 构建属性公开,因此您也可以在构建文件中使用 ${java.home}。

jre.home 会是一个更好的名字吗?也许吧,但我认为 Sun 不会改变它。

可以看到 maven 在 mvn.bat 上使用了 JAVA_HOME:

:endInit
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
..
%MAVEN_JAVA_EXE% %MAVEN_OPTS% -classpath %CLASSWORLDS_JAR% ..

如果你想确定,你可以在mvn.bat中注释掉“@echo off”语句,这样你就可以看到它正在被使用。


TL;DR:根据您提供的信息,您的配置是正确的,无需更改任何内容。


编辑:感谢这个线程,还有一个关于这令人困惑的问题,这导致 Maven 版本 3.5.4 的输出发生变化。

于 2013-03-07T19:06:32.143 回答
1

帮助我调试 mvn/jdk 问题的是在运行 mvn 之前设置它: set MAVEN_BATCH_ECHO=on

你会得到详细的输出(在 Windows 上),包括 Maven 如何选择 java 的信息。

于 2019-04-14T09:34:15.067 回答