Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java_home in Maven

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" 
like image 465
One Two Three Avatar asked Mar 07 '13 19:03

One Two Three


People also ask

Is JAVA_HOME necessary for Maven?

How does Maven verify the JAVA_HOME path? Before running any goals, Maven checks for the existence of the java command in the path specified by JAVA_HOME or by asking the OS for a default JDK installation. If the executable is not found, Maven terminates with the error.

How do I find my JAVA_HOME path?

Verify JAVA_HOME Open a Command Prompt window (Win⊞ + R, type cmd, hit Enter). Enter the command echo %JAVA_HOME% . This should output the path to your Java installation folder. If it doesn't, your JAVA_HOME variable was not set correctly.

How do I set my JAVA_HOME?

To set JAVA_HOME, do the following: Right click My Computer and select Properties. On the Advanced tab, select Environment Variables, and then edit JAVA_HOME to point to where the JDK software is located, for example, C:\Program Files\Java\jdk1. 6.0_02.

What is JAVA_HOME used for?

Basically JAVA_HOME is use to set path of the java . it is use in windows. it's used for set path of the multiple software like as java EE , ANT and Maven .


1 Answers

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.

like image 132
eis Avatar answered Sep 22 '22 19:09

eis