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
Когда вы запускаете это:
- Оболочка выполняет расширение параметров и удаление кавычек, заменяя
"$JAVA_HOME"
со значением (т.е. содержимым)JAVA_HOME
, Если в нем нет пробелов, кавычки не нужны (их целью здесь является предотвращение разбиения слов). sudo
вызывается с тремя аргументами:JAVA_HOME=...
, где...
это значениеJAVA_HOME
когда вы запустили команду;mvn
, а такжеspring-boot:run
,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
переменная окружения будет сохранена.