2013-03-07 2 views
28

Когда я побежал mvn -version, я заметил java_home пунктов ...jdk\jre (как показано ниже). Это неправильно? Разве это не должно указывать на ...\jdk.x.y.z (без \jre)? Если да, то как его сбросить? (В глобальных %java_home% указывает на каталог jdk)Java_home in Maven

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" 

ответ

50

Нет, это не так. Это указывает на JRE, используемый вашим JDK, и это то, что он должен. Если распечатать 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 (специалист нуждается в tools.jar), но на самом деле Maven использует JRE в JDK, чтобы запустить себя ,

При использовании mvn -version, специалист использует 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} в файлах сборки, используя .

Будет ли лучшее имя? Может быть, но я не думаю, что Солнце будет изменить его.

Вы можете видеть, что Maven использует JAVA_HOME на mvn.bat:

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

И если вы хотите, чтобы убедиться, вы можете закомментировать «@echo от» заявление в mvn.bat, так что вы может видеть, что он используется.


TL; DR: На основании информации, которую вы указали, ваша конфигурация верна, не нужно ничего менять.


Редактировать: теперь есть также an issue open about this being confusing. Возможно, они изменят его в будущем.

+0

Спасибо! +1 для «TL; DR';)) –

+0

Нет проблем. Может быть, согласиться, если вы чувствуете, что это ответили на вопрос :) – eis

+0

@eis Привет, У меня проблема: http://stackoverflow.com/questions/26313902/maven-error-perhaps-you-are-running-on-a- jre-rather-than-a-jdk здесь, можете ли вы, пожалуйста, помочь мне разобраться. Благодарю. – Kraken