JAVA__HOME должен указывать на JDK, а не на JRE

JAVA_HOME должен указывать на JDK, а не на JRE

1. Вступление

В этом руководстве мы поговорим об исключении, которое Maven выдает при неправильной настройке:JAVA_HOME should point to a JDK, not a JRE.

Maven - мощный инструмент для создания кода. Мы посмотрим изнутри, чтобы понять, почему происходит эта ошибка, и посмотрим, как ее устранить.

2. ПроблемаJAVA_HOME

После установки Maven выполняетсяwe have to set the JAVA_HOME environment variable, so the tool knows where to find the JDK commands. Цели Maven запускают соответствующие команды Java в исходном коде проекта.

Например, наиболее распространенным сценарием является компиляция кода путем выполнения командыjavac.

ЕслиJAVA_HOME is not pointing to a valid JDK installation, Maven выдает ошибку при каждом выполнении:

mvn -version

# Output... 
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK, not a JRE

3. JDK или JRE

Как Maven проверяет путьJAVA_HOME?

Перед запуском любых целей введитеMaven checks for the existence of the java command по пути, указанномуJAVA_HOME, или запросив у ОС установку JDK по умолчанию. If the executable is not found, Maven terminates with the error.

Вот проверка исполняемого файлаmvn для Linux (Apache Maven v3.5.4):

if [ -z "$JAVA_HOME" ] ; then
    JAVACMD=`which java`
else
    JAVACMD="$JAVA_HOME/bin/java"
fi
 
if [ ! -x "$JAVACMD" ] ; then
    echo "The JAVA_HOME environment variable is not defined correctly" >&2
    echo "This environment variable is needed to run this program" >&2
    echo "NB: JAVA_HOME should point to a JDK not a JRE" >&2
    exit 1
fi

Эта проверка на первый взгляд может показаться разумной, но мы должны учитывать, чтоboth JDK and JRE have a bin folder and both contain an executable java file.

Следовательно, этоpossible to configure JAVA_HOME to point to a JRE installation, hiding this particular error and causing problems at a later stage.. В то время как основная цель JRE - запуск кода Java,the JDK can also compile and debug among other important differences.

По этой причине командаmvn compile не сработает, как мы увидим в следующем подразделе.

3.1. Ошибка компиляции из-за JRE вместо JDK

Как обычно с настройками по умолчанию, они очень полезны, если у нас есть «стандартная» конфигурация.

Например, если мы устанавливаем Java 11 в системе Ubuntu 18.04 и не устанавливаем переменную средыJAVA_HOME, Maven все равно с радостью найдет наш JDK и будет использовать его для различных целей, включая компиляцию.

Но если нам удалось настроить нестандартную конфигурацию (не говоря уже о том, чтобы навести беспорядок) в нашей системе, полезности Maven уже недостаточно. Это может даже вводить в заблуждение.

Предположим, у нас есть следующая конфигурация в Ubuntu 18.04:

  • JDK 11

  • JRE 8

  • JAVA_HOME - путь к установке JRE 8

Если мы сделаем нашу основную проверку:

mvn --version

Мы получим такой значимый результат:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /opt/apache-maven-3.6.0
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-42-generic", arch: "amd64", family: "unix"

Посмотрим, что произойдет, если мы попытаемся скомпилировать проект:

mvn clean compile

Теперь мы получаем ошибку:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project my-app: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

3.2. Исправление ошибки компиляции на уровне проекта

Как и во многих других случаях с Maven, рекомендуется установить значимые общесистемные настройки - в этом случае мы изменим значение переменнойJAVA_HOME, как описано в разделе 5, чтобы указать на JDK вместо JRE.

Однако, если по какой-либо причине мы не можем установить значения по умолчанию,we can still override the settings on the project level. Посмотрим, как это сделать.

Сначала мы откроемpom.xml нашего проекта, перейдем в разделbuild / pluginManagement / plugins и посмотрим на запись дляmaven-compiler-plugin:


    maven-compiler-plugin
    3.7.0

Затем мы добавим в него конфигурацию, чтобы он использовал настраиваемый исполняемый файл, и пропустили поискjavac в каталогеJAVA_HOME/bin:


    maven-compiler-plugin
    3.7.0
    
        true
        /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
    

В системах Unix этот исполняемый файл должен быть скриптом с соответствующими разрешениями. В системах Windows это должен быть файл.exe.

Далее попробуем снова скомпилировать проект:

mvn clean compile

Теперь сборка - включая фазу компиляции сmaven-compiler-plugin - прошла успешно.

4. Проверка конфигурацииJAVA_HOME

check if JAVA_HOME points to an actual JDK.  довольно просто. Мы можем либо распечатать его содержимое в терминале, либо запустить одну из следующих команд оболочки:

4.1. ПроверкаJAVA_HOME в Linux

Просто откройте терминал и введите:

> $JAVA_HOME/bin/javac -version

ЕслиJAVA_HOME указывает на JDK, результат должен выглядеть так:

> javac 1.X.0_XX

ЕслиJAVA_HOME не указывает на JDK, ОС выдает сообщение об ошибке:

> bash: /bin/javac: No such file or directory

4.2. ПроверкаJAVA_HOME в Windows

Откройте командную строку и введите:

%JAVA_HOME%\bin\javac -version

ЕслиJAVA_HOME указывает на JDK, результат должен выглядеть так:

> javac 1.X.0_XX

ЕслиJAVA_HOME не указывает на JDK, ОС выдает сообщение об ошибке:

> The system cannot find the path specified.

5. Как решить проблему

Прежде всего, нам нужно знать, где найти наш JDK:

  • Если мы установили наш дистрибутив JDK с помощью установщика пакетов, мы сможем найти путь с помощью утилиты поиска ОС

  • Если дистрибутив был переносным, давайте проверим папку, в которую мы его извлекли.

Once we know the path to the JDK, we can set our JAVA_HOME environment variable, используяthe appropriate results for our particular OS.

6. Заключение

В этом кратком руководстве мы обсудили ошибку «JAVA_HOME should point to a JDK not a JRE” Maven и изучили ее первопричину.

Наконец, мы обсудили, как проверить вашу переменную средыJAVA_HOME и как убедиться, что она указывает на JDK.