Java_home in Maven
Asked Answered
U

2

45

When I ran mvn -version, I noticed the java_home points to ...jdk\jre (as shown below). Is that wrong? Isn't it supposed to point to ...\jdk.x.y.z (without the \jre)? If so, how do I reset it? (In global %java_home% points to the jdk directory)

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"
Urogenous answered 7/3, 2013 at 19:3 Comment(0)
S
76

No, it's not wrong. It is pointing to the JRE used by your JDK, which is what it's supposed to. If you print out JAVA_HOME outside maven, it should print correctly:

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:\>

So basically JAVA_HOME needs to point to a JDK installation (maven needs the tools.jar) but maven actually uses the jre within the JDK to run itself.

When using mvn -version, maven uses java internal java.home property, as can be seen from source code:

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

This property is not the same thing as JAVA_HOME environment setting, so it might fool you. It is actually dynamic property showing you which JRE is running your code. If you compile and execute a Test.java test class printing the same, you can see that if your JAVA_HOME points to a JDK, the value of java.home is not equal to your JAVA_HOME. This is expected.

Quoting this:

What's the difference between JAVA_HOME and java.home?

JAVA_HOME is the JDK install directory, e.g., C:\jdk5. It's meant to be set as an environment variable and referenced in Windows batch files or Unix scripts. I always have it in my Windows Control Panel and .tcsh files,along with other common environment variables. Some Java applications use the name jdk.home for this purpose, which I think is a better name. But JAVA_HOME has been used since the beginning and is now a convention.

java.home is the JRE install directory, e.g., C:\jdk5\jre, or C:\Program Files\Java\jre1.5.0_06. Unlike JAVA_HOME, I never seen java.home as an environment variable. java.home is a build-in Java system property, whose value is the JRE install directory. Since all Java system properties are also exposed as Ant build properties, you can also use ${java.home} in build files.

Would jre.home be a better name? Maybe, but I don't think Sun will change it.

You can see that maven uses JAVA_HOME on mvn.bat:

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

And if you want to make sure, you can comment out "@echo off" statement in mvn.bat, so you can see that it is being used.


TL;DR: Based on the information you've given, your configuration is correct, no need to change anything.


Edit: thanks to this thread, there was also an issue about this being confusing, which resulted in change of output for Maven version 3.5.4.

Stimulus answered 7/3, 2013 at 19:6 Comment(6)
Thanks! +1 for the TL;DR ;))Urogenous
No prob. Maybe accept if you feel this answered the question :)Stimulus
@Stimulus Hi, I've got a problem #26314402 here, can you please help me figure it out. Thanks.Wriggle
@Wriggle apparently you got it sorted yourself. Indeed, tools.jar is needed by Maven.Stimulus
This was more complicated than it needed to be. Could you add instructions to "copy your JDK lib/tools.jar to /jre/lib"?Fir
@intlawlisover9000 why? you definitely shouldn't do that.Stimulus
P
1

What helped me debugging mvn/jdk issues is to set this before running mvn: set MAVEN_BATCH_ECHO=on

You get verbose output (on windows), including info how Maven picks java.

Pallaten answered 14/4, 2019 at 9:34 Comment(1)
When I added JAVA_HOME to my Windows 10 install, I entered two directories, separated by a semicolon. When I removed the second entry, Windows kept the semicolon, which showed up because of this setting.Motion

© 2022 - 2024 — McMap. All rights reserved.