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 visudosudo 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 переменная окружения будет сохранена.