Рубрики
Без рубрики

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

Узнайте о первопричине ошибки Maven ‘JAVA_HOME должны указать на JDK, а не JRE’ и как ее устранить

Автор оригинала: baeldung.

1. Введение

В этом учебнике, мы будем говорить об исключении, что Maven бросает, когда неправильно настроены: JAVA_HOME должны указывать на JDK, а не JRE.

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

2. JAVA_HOME проблема

После установки Maven, мы должны установить JAVA_HOME переменная среды, так что инструмент знает, где найти команды JDK для выполнения. Цели Maven управляют соответствующими командами Java в отношении исходных кодов проекта.

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

Если JAVA_HOME не указывает на действительную установку JDK , 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 проверяет на существование Ява командный в пути, указанном JAVA_HOME или попросив ОС для установки JDK по умолчанию. Если выполненный не найден, Maven завершает работу с ошибкой.

Вот мвн выполняемая проверка 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

Эта проверка может показаться разумной на первый взгляд, но мы должны учитывать, что и JDK и JRE имеют бен папка и оба содержат выируемый Ява файл.

Таким образом, это можно настроить JAVA_HOME указать на установку JRE, скрывая эту конкретную ошибку и вызывая проблемы на более позднем этапе. В то время как основная цель JRE заключается в запуске Java-кода, JDK также может компилировать и отладить среди других важных различий .

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

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.

Однако, если мы не можем настроить по умолчанию по какой-либо причине, мы все еще можем переопределить настройки на уровне проекта. Давайте посмотрим, как это сделать.

Во-первых, мы откроем пом.xml нашего проекта, перейдите в раздел сборка/плагинУгон/плагины и взглянуть на запись для Maven-компилятор-плагин :


    maven-compiler-plugin
    3.7.0

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


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

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

Далее мы попытаемся составить проект еще раз:

mvn clean compile

Теперь сборка , включая фазу компиляции с Maven-компилятор-плагин – успешно.

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

Это довольно просто проверить, если JAVA_HOME указывает на фактический 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 с помощью установки пакета, мы должны быть в состоянии найти путь с помощью утилиты поиска ОС
  • Если дистрибутив был портативным, давайте проверим папку, где мы ее извлекли

Как только мы узнаем путь к JDK, мы можем установить нашу JAVA_HOME переменная среда , с использованием соответствующие результаты для нашей конкретной системы .

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

В этом кратком учебнике мы обсудили « JAVA_HOME должны указать на JDK не JRE “ Maven ошибки и рассмотрел его первопричину.

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