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.