Maven: JAVA_HOME не определен правильно

Я установил и настроил Maven и Java. Я могу успешно бежать

mvn spring-boot:run

Но когда я бегу

sudo mvn spring-boot:run

я получаю Maven: JAVA_HOME is not defined correctly

Когда я делаю

$ echo $JAVA_HOME
/home/ubuntu/jdk1.8.0_26

Я что-то здесь упускаю?

1 ответ

Решение

Возможно, вы захотите отредактировать свой sudoers файл с sudo visudo найти строку Defaults env_reset и добавить строку Defaults env_keep = "JAVA_HOME" под этим. См. Ниже для объяснения, деталей и альтернатив.

Зачем sudo Очищает JAVA_HOME

Когда вы запускаете команду с sudo по умолчанию ваша среда не передается нетронутой. Большинство переменных среды удаляются для безопасности, и это обычно желательно. Как man sudoers говорит, в разделе "Командная среда":

Поскольку переменные среды могут влиять на поведение программы, sudoers предоставляет средство для ограничения того, какие переменные из среды пользователя наследуются командой, которая будет запущена. Есть два разных способа sudoers может иметь дело с переменными среды.

По умолчанию env_reset опция включена. Это заставляет команды выполняться в новой, минимальной среде. В AIX (и системах Linux без PAM) среда инициализируется с содержимым /etc/environment файл. Новая среда содержит переменные TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME и SUDO_* в дополнение к переменным из процесса вызова, разрешенного env_check а также env_keep опции. Это фактически белый список для переменных среды.

Однако, если опция env_reset отключена, любые переменные явно не запрещены ....

Позволить JAVA_HOME Через один раз

Один вариант, если вы редко запускаете mvn spring-boot:run как root и предпочитаете вообще не изменять свою конфигурацию, просто передайте значение JAVA_HOME вручную:

sudo JAVA_HOME="$JAVA_HOME" mvn spring-boot:run

Когда вы запускаете это:

  1. Оболочка выполняет расширение параметров и удаление кавычек, заменяя "$JAVA_HOME" со значением (т.е. содержимым) JAVA_HOME, Если в нем нет пробелов, кавычки не нужны (их целью здесь является предотвращение разбиения слов).
  2. sudo вызывается с тремя аргументами: JAVA_HOME=..., где ... это значение JAVA_HOME когда вы запустили команду; mvn, а также spring-boot:run,
  3. sudo признает variable=value синтаксис, и знает, чтобы запустить mvn с JAVA_HOME установить на указанное значение. (spring-boot:run передается в качестве первого аргумента командной строки mvn).

Чтобы передать все переменные окружения, вы можете запустить sudo -E mvn spring-boot:run, но это потенциально менее безопасно и не идеально, потому что JAVA_HOME единственная переменная, значение которой нужно сохранить (кроме нескольких переменных, значения которых автоматически сохраняются даже при env_reset).

Позволить JAVA_HOME Через каждый раз

Хотя вы могли бы отключить env_reset в вашем sudoers файл, он будет передавать почти все переменные среды пользователя через каждый раз sudo запускается, и по этой причине не рекомендуется.

Вместо этого я рекомендую вам отредактировать sudoers файл и добавить соответствующий env_keep линия после env_reset линия.

  • Пожалуйста, не редактируйте /etc/sudoers непосредственно. Вместо этого вы всегда должны использовать visudo команда для этого, которая проверяет, чтобы ваш синтаксис был правильным (предотвращая создание недопустимого sudoers файл, который блокирует sudo пока не исправлено).

Бежать:

sudo visudo

Это будет использовать ваш текстовый редактор командной строки по умолчанию. Если вы хотите использовать другой редактор, вы можете запустить visudo с этим назначен VISUAL переменная окружения. Например:

  • sudo VISUAL=nano visudo
  • sudo VISUAL=gedit visudo

( VISUAL не так назван в честь "Vis" в visudo ; вместо этого это переменная окружения для определения текстовых редакторов по умолчанию. Вы также можете использовать EDITOR переменная, но VISUAL имеет приоритет, если установлен.)

Бег visudo открывает временную копию вашего sudoers файл в текстовом редакторе; при выходе изменения, внесенные в эту копию, записываются в /etc/sudoers,

Найдите строку, которая говорит:

Defaults        env_reset

Добавьте строку прямо под ней, говоря:

Defaults        env_keep = "JAVA_HOME"

(Если у вас уже есть env_keep строка, добавить JAVA_HOME в цитируемый список разрешенных переменных. Имена переменных отделены друг от друга пробелами.)

Сохраните файл и выйдите из текстового редактора. Теперь, когда пользователи запускают команды с sudo, JAVA_HOME переменная окружения будет сохранена.

Другие вопросы по тегам