JAVA__HOME devrait pointer vers un JDK et non un JRE

JAVA_HOME devrait pointer vers un JDK et non un JRE

1. introduction

Dans ce didacticiel, nous allons parler d'une exception que Maven lève lorsqu'elle est mal configurée:JAVA_HOME should point to a JDK, not a JRE.

Maven est un outil puissant pour le code de construction. Nous allons regarder sous le capot pour comprendre pourquoi cette erreur se produit et nous allons voir comment le résoudre.

2. Le problème deJAVA_HOME

Après avoir installé Maven,we have to set the JAVA_HOME environment variable, so the tool knows where to find the JDK commands à exécuter. Les objectifs Maven exécutent les commandes Java appropriées sur le code source du projet.

Par exemple, le scénario le plus courant consiste à compiler le code en exécutant la commandejavac.

SiJAVA_HOME is not pointing to a valid JDK installation, Maven lancera une erreur à chaque exécution:

mvn -version

# Output... 
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK, not a JRE

3. JDK ou JRE

Comment Maven vérifie-t-il le cheminJAVA_HOME?

Avant d'exécuter des objectifs,Maven checks for the existence of the java command dans le chemin spécifié parJAVA_HOME ou en demandant au système d'exploitation une installation JDK par défaut. If the executable is not found, Maven terminates with the error.

Voici la vérification de l'exécutable demvn pour Linux (Apache Maven v3.5.4):

if [ -z "$JAVA_HOME" ] ; then
    JAVACMD=`which java`
else
    JAVACMD="$JAVA_HOME/bin/java"
fi
 
if [ ! -x "$JAVACMD" ] ; then
    echo "The JAVA_HOME environment variable is not defined correctly" >&2
    echo "This environment variable is needed to run this program" >&2
    echo "NB: JAVA_HOME should point to a JDK not a JRE" >&2
    exit 1
fi

Cette vérification peut sembler raisonnable à première vue, mais il faut considérer queboth JDK and JRE have a bin folder and both contain an executable java file.

Par conséquent, c'estpossible to configure JAVA_HOME to point to a JRE installation, hiding this particular error and causing problems at a later stage. Alors que l'objectif principal du JRE est d'exécuter du code Java,the JDK can also compile and debug among other important differences.

Pour cette raison, une commandemvn compile échouerait - comme nous le verrons dans la sous-section suivante.

3.1. Échec de la compilation en raison de JRE au lieu de JDK

Comme d'habitude avec les paramètres par défaut, ils sont très utiles si nous avons une configuration "standard".

Par exemple, si nous installons Java 11 sur un système Ubuntu 18.04 et ne définissons pas la variable d'environnementJAVA_HOME, Maven trouvera toujours avec plaisir notre JDK et l'utilisera pour les différents objectifs, y compris la compilation.

Mais si nous avons réussi à mettre en place une configuration non standard (sans parler du désordre) sur notre système, l’utilité de Maven ne suffit plus. Cela peut même être trompeur.

Supposons que nous ayons la configuration suivante sur Ubuntu 18.04:

  • JDK 11

  • JRE 8

  • JAVA_HOME défini sur le chemin de l'installation de JRE 8

Si nous faisons notre contrôle de base:

mvn --version

Nous obtiendrons un résultat significatif comme celui-ci:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z)
Maven home: /opt/apache-maven-3.6.0
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-42-generic", arch: "amd64", family: "unix"

Voyons ce qui se passe si nous essayons de compiler un projet:

mvn clean compile

Maintenant, nous obtenons une erreur:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project my-app: Compilation failure
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

3.2. Correction de l'erreur de compilation au niveau du projet

Comme dans de nombreux autres cas avec Maven, il est recommandé de configurer des paramètres significatifs à l'échelle du système - dans ce cas, nous changerons la valeur de la variableJAVA_HOME comme décrit dans la section 5 pour pointer vers le JDK au lieu du JRE.

Cependant, si nous ne pouvons pas configurer les paramètres par défaut pour une raison quelconque,we can still override the settings on the project level.  Voyons comment procéder.

Tout d'abord, nous allons ouvrir lespom.xml de notre projet, aller à la sectionbuild / pluginManagement / plugins et jeter un œil à l'entrée pour lesmaven-compiler-plugin:


    maven-compiler-plugin
    3.7.0

Ensuite, nous y ajouterons une configuration afin qu'il utilise un exécutable personnalisé et ignorons la recherche dejavac dans le répertoireJAVA_HOME/bin:


    maven-compiler-plugin
    3.7.0
    
        true
        /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
    

Sur les systèmes Unix, cet exécutable doit être un script avec les autorisations appropriées. Sur les systèmes Windows, il doit s'agir d'un fichier.exe.

Ensuite, nous essaierons de recompiler le projet:

mvn clean compile

Maintenant, la construction - y compris la phase de compilation avec lesmaven-compiler-plugin - est réussie.

4. Vérification de la configuration deJAVA_HOME

C'est assez simple decheck if JAVA_HOME points to an actual JDK. Nous pouvons soit imprimer son contenu dans un terminal, soit exécuter l'une des commandes shell suivantes:

4.1. Vérification deJAVA_HOME sous Linux

Ouvrez juste un terminal et tapez:

> $JAVA_HOME/bin/javac -version

SiJAVA_HOME pointe vers un JDK, la sortie devrait ressembler à:

> javac 1.X.0_XX

SiJAVA_HOME ne pointe pas vers un JDK, le système d'exploitation affichera un message d'erreur:

> bash: /bin/javac: No such file or directory

4.2. Vérification deJAVA_HOME sous Windows

Ouvrez une invite de commande et tapez:

%JAVA_HOME%\bin\javac -version

SiJAVA_HOME pointe vers un JDK, la sortie devrait ressembler à:

> javac 1.X.0_XX

SiJAVA_HOME ne pointe pas vers un JDK, le système d'exploitation affichera un message d'erreur:

> The system cannot find the path specified.

5. Comment résoudre le problème

Tout d’abord, nous devons savoir où trouver notre kit JDK:

  • Si nous avons installé notre distribution JDK à l'aide d'un programme d'installation, nous devrions pouvoir trouver le chemin à l'aide de l'utilitaire de recherche de système d'exploitation.

  • Si la distribution était portable, vérifions le dossier dans lequel nous l'avons extraite

Once we know the path to the JDK, we can set our JAVA_HOME environment variable, en utilisantthe appropriate results for our particular OS.

6. Conclusion

Dans ce bref didacticiel, nous avons abordé l’erreur «JAVA_HOME should point to a JDK not a JRE” Maven» et examiné sa cause première.

Enfin, nous avons expliqué comment vérifier votre variable d'environnementJAVA_HOME et comment nous assurer qu'elle pointe vers un JDK.