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?
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:
- 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).
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
.
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 sudoers
fichier 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.