Maven: JAVA_HOME não está definido corretamente

2

Eu instalei e configurei o Maven e o Java. Posso com sucesso executar

mvn spring-boot:run

Mas quando eu corro

sudo mvn spring-boot:run

Estou recebendo Maven: JAVA_HOME is not defined correctly

Quando faço

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

Estou faltando alguma coisa aqui?

    
por kranthi117 10.04.2015 / 11:05

1 resposta

4

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, sudoers   fornece um meio de restringir quais variáveis do usuário   ambiente são herdados pelo comando a ser executado. Existem dois   maneiras distintas sudoers pode lidar com variáveis de ambiente.

     

Por padrão, a opção env_reset está 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/environment file. 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 pelo    env_check e env_keep opçõ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:

  1. O shell executa a expansão de parâmetros e quote remoção , substituindo "$JAVA_HOME" pelo valor (ou seja, conteúdo) de JAVA_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 ).
  2. sudo é chamado com três argumentos: JAVA_HOME=... , em que ... é o valor de JAVA_HOME quando você executou o comando; mvn e spring-boot:run .
  3. sudo reconhece a sintaxe variable=value e sabe executar mvn com JAVA_HOME definido para o valor especificado. ( spring-boot:run é passado como o primeiro argumento de linha de comando para mvn ).

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/sudoers diretamente. Em vez disso, você deve sempre usar o comando visudo para isso, que verifica para garantir que sua sintaxe está correta (evitando a criação de um arquivo sudoers inválido que trava sudo até 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.

    
por Eliah Kagan 10.04.2015 / 19:38