Question 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
2018-04-10 09:05


origine




Réponses:


Vous voudrez probablement modifier votre sudoers fichier avec sudo visudo, trouve la ligne Defaults env_reset et ajouter une ligne Defaults env_keep = "JAVA_HOME" dessous. Voir ci-dessous pour des explications, des détails et des alternatives.

Pourquoi sudo Est la compensation JAVA_HOME

Lorsque vous exécutez une commande avec sudo, par défaut votre environnement est ne pas passé 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 dit, dans la section "Environnement de commande":

Puisque les variables d’environnement peuvent influencer le comportement du programme, sudoers   fournit un moyen de restreindre les variables de l'utilisateur   L'environnement est hérité par la commande à exécuter. Il y en a deux   des moyens distincts sudoers peut traiter des variables d'environnement.

Par défaut, le env_reset L'option est activée. Cela provoque des commandes à   être exécuté avec un nouvel environnement minimal. Sur les systèmes AIX (et Linux)   sans PAM), l'environnement est initialisé avec le contenu du    /etc/environment fichier. Le nouvel environnement contient le TERM, PATH,   Les variables HOME, MAIL, SHELL, LOGNAME, USER, USERNAME et SUDO_ * dans   addition aux variables du processus d'appel autorisé par le    env_check et env_keep options C'est effectivement une liste blanche   pour les variables d'environnement.

Si, toutefois, l’option env_reset est désactivée, toutes les variables ne   explicitement refusé ....

Location JAVA_HOME À travers une fois

Une option, si vous courez rarement mvn spring-boot:run en tant que root et que vous préférez ne pas changer votre configuration, il suffit de transmettre la valeur de JAVA_HOME manuellement:

sudo JAVA_HOME="$JAVA_HOME" mvn spring-boot:run

Quand tu cours ça:

  1. Le shell effectue extension des paramètres et suppression de devis, remplacement "$JAVA_HOME" avec la valeur (c.-à-d. contenu) de JAVA_HOME. Si cela ne contient pas d'espaces, les guillemets ne sont pas nécessaires (leur but est d'empêcher fractionnement des 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 variable=value syntaxe, et sait courir mvn avec JAVA_HOME définir à la valeur spécifiée. (spring-boot:run est passé comme premier argument de ligne de commande à mvn).

Passer tout vos variables d'environnement à travers, vous pouvez exécuter sudo -E mvn spring-boot:run, mais cela est potentiellement moins sûr et pas idéal parce que JAVA_HOME est la seule variable dont vous avez besoin de conserver la valeur (outre la poignée de variables dont les valeurs sont automatiquement préservées même avec env_reset).

Location JAVA_HOME À travers chaque fois

Bien que vous puissiez désactiver env_reset dans ton sudoers fichier, cela passerait presque toutes les variables d'environnement d'un utilisateur à chaque fois sudo est exécuté, et pour cette raison n'est pas recommandé.

Au lieu de cela, je vous recommande de modifier votre sudoersfichier et ajouter un approprié env_keep ligne après le env_reset ligne.

  • S'il vous plaît ne pas modifier /etc/sudoers directement. Au lieu de cela, vous devriez toujours utiliser le visudo commande pour cela, qui vérifie que votre syntaxe est correcte (empêchant la création d'un fichier invalide). sudoers fichier qui se bloque sudo jusqu'à fixe).

Courir:

sudo visudo

Cela utilisera votre éditeur de texte de ligne de commande par défaut. Si vous voulez utiliser un éditeur différent, vous pouvez exécuter visudo avec elle assignée à la VISUAL variable d'environnement. Par exemple:

  • sudo VISUAL=nano visudo
  • sudo VISUAL=gedit visudo

(VISUAL n'est pas ainsi nommé d'après le "vis" dans visudo; au lieu de cela, c'est la variable d'environnement pour spécifier les éditeurs de texte par défaut. Vous pouvez également utiliser le EDITOR variable, mais VISUAL prend la priorité si elle est définie.)

Fonctionnement visudo ouvre une copie temporaire de votre sudoers fichier 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"

(Si vous avez déjà un env_keep ligne, ajouter JAVA_HOME à la liste citée des variables autorisées. Les noms de variable sont séparés les uns des autres par des espaces.)

Enregistrez le fichier et quittez l'éditeur de texte. Maintenant, quand les utilisateurs exécutent des commandes avec sudo, la JAVA_HOME la variable d'environnement sera préservée.


4
2018-04-10 17:38



Merci ça a fonctionné. Une question cependant, je suis capable de courir sudo echo $JAVA_HOME sans aucun problème. Pourquoi donc ? Je n'ai pas modifié le fichier sudoers btw - kranthi117
@ kranthi117 Parce que même quand tu cours sudo echo $JAVA_HOME, la JAVA_HOME la variable d'environnement est évaluée en tant qu'utilisateur, ne pas en tant que root. Plus précisément, la coque se développe d'abord $JAVA_HOME, avant d'invoquer le sudo commander. sudo puis reçoit echo comme son premier argument et le valeur (c.-à-d. contenu) JAVA_HOME avait dans le propre environnement du shell appelant comme deuxième argument. Une façon de voir la valeur d'une variable d'environnement lorsque sudo a pour racine est d'exécuter un shell racine avec sudo et de faire en sorte que ce shell l'évalue à la place du shell appelant non root: sudo sh -c 'echo $JAVA_HOME' - Eliah Kagan