web-dev-qa-db-fra.com

Maven: Java_HOME n'est pas défini correctement

J'ai installé et configuré Maven et Java. Je peux avec succès courir

mvn spring-boot:run

Mais quand je cours

Sudo mvn spring-boot:run

Je reçois Maven: Java_HOME is not defined correctly

Quand je fais

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

Est-ce que j'ai râté quelque chose?

2
kranthi117

Vous voudrez probablement éditer votre fichier sudoers avec _Sudo visudo_, trouver la ligne _Defaults env_reset_ et ajouter une ligne _Defaults env_keep = "Java_HOME"_ en dessous. Voir ci-dessous pour des explications, des détails et des alternatives.

Pourquoi Sudo efface-t-il _Java_HOME_

Lorsque vous exécutez une commande avec Sudo, votre environnement est par défaut not ​​transmis intact. La plupart des variables d'environnement sont supprimées, pour des raisons de sécurité, ce qui est généralement souhaitable. Comme man sudoers , dans la section "Environnement de commande":

Les variables d'environnement pouvant influer sur le comportement du programme, sudoers permet de limiter les variables de l'environnement de l'utilisateur héritées par la commande à exécuter. sudoers peut traiter les variables d'environnement de deux manières différentes.

Par défaut, l'option _env_reset_ est activée. Cela provoque l'exécution de commandes avec un nouvel environnement minimal. Sous AIX (et les systèmes Linux sans PAM), l'environnement est initialisé avec le contenu du fichier _/etc/environment_. Le nouvel environnement contient les variables TERM, PATH, HOME, MAIL, Shell, LOGNAME, USER, USERNAME et Sudo_ *, en plus des variables du processus d'appel autorisé par les options _env_check_ et _env_keep_. C'est effectivement une liste blanche pour les variables d'environnement.

Si, toutefois, l'option env_reset est désactivée, toutes les variables non explicitement refusées ....

Laisser _Java_HOME_ travers une fois

Une option, si vous exécutez rarement _mvn spring-boot:run_ en tant que root et préférez ne pas modifier la configuration du tout, consiste simplement à transmettre manuellement la valeur de _Java_HOME_:

_Sudo Java_HOME="$Java_HOME" mvn spring-boot:run
_

Quand vous courez ça:

  1. Le shell effectue expansion du paramètre et suppression du devis , en remplaçant _"$Java_HOME"_ par la valeur (c'est-à-dire le contenu) de _Java_HOME_. Si cela ne contient aucun espace, les guillemets ne sont pas nécessaires (leur but ici est d'empêcher fractionnement de mots ).
  2. Sudo est appelé avec trois arguments: _Java_HOME=..._, où _..._ est la valeur de _Java_HOME_ lorsque vous avez exécuté la commande; mvn et _spring-boot:run_.
  3. Sudo reconnaît la syntaxe _variable=value_ et sait exécuter mvn avec _Java_HOME_ défini sur la valeur spécifiée. (_spring-boot:run_ est passé en tant que premier argument de ligne de commande à mvn).

Pour passer all vos variables d'environnement, vous pouvez exécuter _Sudo -E mvn spring-boot:run_, mais ceci est potentiellement moins sécurisé et pas idéal car _Java_HOME_ est la seule variable dont vous avez besoin de conserver la valeur (à part la poignée de variables dont les valeurs sont automatiquement conservées même avec _env_reset_).

Laisser _Java_HOME_ à chaque fois

Bien que vous puissiez désactiver _env_reset_ dans votre fichier sudoers, cela transmet presque toutes les variables d'environnement d'un utilisateur à chaque exécution de Sudo et, pour cette raison, n'est pas recommandé.

Au lieu de cela, je vous recommande de modifier votre fichier sudoers et d'ajouter une ligne _env_keep_ appropriée après la ligne _env_reset_.

  • Veuillez ne pas éditer _/etc/sudoers_ directement. Au lieu de cela, vous devez toujours utiliser la commande visudo , qui vérifie que votre syntaxe est correcte (empêchant la création d'un fichier sudoers non valide qui verrouille Sudo jusqu'à ce qu'il soit corrigé ) .

Courir:

_Sudo visudo
_

Cela utilisera votre éditeur de texte par défaut en ligne de commande. Si vous souhaitez utiliser un autre éditeur, vous pouvez exécuter visudo avec celui-ci affecté à la variable d'environnement VISUAL. Par exemple:

  • _Sudo VISUAL=nano visudo_
  • _Sudo VISUAL=gedit visudo_

(VISUAL ne porte pas le même nom que le "vis" dans visudo; il s'agit plutôt de la variable d'environnement permettant de spécifier les éditeurs de texte par défaut. Vous pouvez également utiliser la variable EDITOR, mais VISUAL est prioritaire s'il est défini.)

Exécuter visudo ouvre une copie temporaire de votre fichier sudoers dans un éditeur de texte; à la sortie, les modifications apportées à cette copie sont écrites dans _/etc/sudoers_.

Trouvez la ligne qui dit:

_Defaults        env_reset
_

Ajoutez une ligne juste en dessous, en disant:

_Defaults        env_keep = "Java_HOME"
_

(If vous avez déjà une ligne _env_keep_, ajoutez _Java_HOME_ à la liste citée des variables autorisées. Les noms de variables sont séparés les uns des autres par des espaces.)

Enregistrez le fichier et quittez l'éditeur de texte. Désormais, lorsque les utilisateurs exécutent des commandes avec Sudo, la variable d’environnement _Java_HOME_ sera préservée.

4
Eliah Kagan