【问题标题】:Java_home in MavenMaven 中的 Java_home
【发布时间】:2013-02-23 03:31:36
【问题描述】:

当我运行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"

【问题讨论】:

    标签: windows maven java java-home


    【解决方案1】:

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

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

    【讨论】:

    • 当我将 JAVA_HOME 添加到我的 Windows 10 安装时,我进入了两个目录,用分号分隔。当我删除第二个条目时,Windows 保留了分号,由于此设置而显示。
    【解决方案2】:

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

    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 来运行自己。

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

    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。这是意料之中的。

    引用this:

    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:根据您提供的信息,您的配置是正确的,无需更改任何内容。


    编辑:感谢这个线程,还有 an issue about this being confusing,这导致 Maven 版本 3.5.4 的输出发生变化。

    【讨论】:

    • 谢谢! +1 TL;DR ;))
    • 没有问题。如果您觉得这回答了问题,也许可以接受:)
    • @eis 嗨,我在这里遇到了stackoverflow.com/questions/26313902/… 的问题,请您帮我解决一下。谢谢。
    • @Kraken 显然你自己整理好了。确实,Maven 需要 tools.jar。
    • 这比它需要的要复杂。您能否添加说明以“将您的 JDK lib/tools.jar 复制到 /jre/lib”?
    猜你喜欢
    • 2013-03-30
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2017-12-27
    • 2021-10-01
    • 2018-05-15
    相关资源
    最近更新 更多