Você provavelmente desejará editar o seu arquivo sudoers com sudo visudo , encontrar a linha Defaults env_reset e adicionar uma linha Defaults env_keep = "JAVA_HOME" abaixo dela. Veja abaixo a explicação, detalhes e alternativas.
Por que sudo está limpando JAVA_HOME
Quando você executa um comando com sudo , por padrão, seu ambiente não é passado intacto. A maioria das variáveis de ambiente é removida, por segurança, e isso geralmente é desejável. Como diz man sudoers , na seção "Ambiente de comando":
Como as variáveis de ambiente podem influenciar o comportamento do programa,
sudoersfornece um meio de restringir quais variáveis do usuário ambiente são herdados pelo comando a ser executado. Existem dois maneiras distintassudoerspode lidar com variáveis de ambiente.Por padrão, a opção
env_resetestá habilitada. Isso faz com que comandos para ser executado com um novo ambiente mínimo. No AIX (e sistemas Linux sem PAM), o ambiente é inicializado com o conteúdo do/etc/environmentfile. O novo ambiente contém o TERM, PATH, Variáveis HOME, MAIL, SHELL, LOGNAME, USER, USERNAME e SUDO_ * além de variáveis do processo de chamada permitido peloenv_checkeenv_keepopções. Esta é efetivamente uma lista de permissões para variáveis de ambiente.Se, no entanto, a opção env_reset estiver desabilitada, quaisquer variáveis não explicitamente negado ....
Deixando JAVA_HOME ao mesmo tempo
Uma opção, se você raramente executar mvn spring-boot:run como root e preferir não alterar sua configuração, é simplesmente passar o valor de JAVA_HOME manualmente:
sudo JAVA_HOME="$JAVA_HOME" mvn spring-boot:run
Quando você executa isso:
- O shell executa a expansão de parâmetros e quote remoção , substituindo
"$JAVA_HOME"pelo valor (ou seja, conteúdo) deJAVA_HOME. Se isso não contiver espaços em branco, as citações não são necessárias (sua finalidade aqui é impedir que a palavra divisão ). -
sudoé chamado com três argumentos:JAVA_HOME=..., em que...é o valor deJAVA_HOMEquando você executou o comando;mvnespring-boot:run. -
sudoreconhece a sintaxevariable=valuee sabe executarmvncomJAVA_HOMEdefinido para o valor especificado. (spring-boot:runé passado como o primeiro argumento de linha de comando paramvn).
Para passar todas suas variáveis de ambiente, você pode executar sudo -E mvn spring-boot:run , mas isso é potencialmente menos seguro e não ideal porque JAVA_HOME é a única variável cujo valor você precisa preservar (além do punhado de variáveis cujos valores são preservados automaticamente mesmo com env_reset ).
Deixando JAVA_HOME a cada vez
Embora você possa desabilitar env_reset no seu arquivo sudoers , isso passaria quase todas as variáveis de ambiente de um usuário a cada vez que sudo fosse executado e, por esse motivo, não é recomendado.
Em vez disso, recomendamos que você edite seu arquivo sudoers e adicione uma linha env_keep apropriada após a linha env_reset .
- Por favor, não edite
/etc/sudoersdiretamente. Em vez disso, você deve sempre usar o comandovisudopara isso, que verifica para garantir que sua sintaxe está correta (evitando a criação de um arquivosudoersinválido que travasudoaté ser corrigido ).
Executar:
sudo visudo
Isso usará seu editor de texto de linha de comando padrão. Se você quiser usar um editor diferente, poderá executar visudo com ele atribuído à variável de ambiente VISUAL . Por exemplo:
-
sudo VISUAL=nano visudo -
sudo VISUAL=gedit visudo
( VISUAL não é assim chamado após o "vis" em visudo ; em vez disso, é a variável de ambiente para especificar editores de texto padrão. Você também pode usar a variável EDITOR , mas VISUAL tem prioridade se definido.)
A execução de visudo abre uma cópia temporária do seu arquivo sudoers em um editor de texto; na saída, as alterações feitas nessa cópia são gravadas em /etc/sudoers .
Encontre a linha que diz:
Defaults env_reset
Adicione uma linha logo abaixo, dizendo:
Defaults env_keep = "JAVA_HOME"
( Se você já tiver uma linha env_keep , adicione JAVA_HOME à lista de variáveis permitidas. Os nomes das variáveis são separados uns dos outros por espaços.)
Salve o arquivo e saia do editor de texto. Agora, quando os usuários executam comandos com sudo , a variável de ambiente JAVA_HOME será preservada.