JAVA_HOME sollte auf ein JDK verweisen, nicht auf eine JRE

1. Einleitung

In diesem Tutorial werden wir über eine Ausnahme sprechen, die Maven bei einer Fehlkonfiguration auslöst : JAVA_HOME sollte auf ein JDK verweisen, nicht auf eine JRE.

Maven ist ein leistungsstarkes Tool zum Erstellen von Code. Wir werden unter die Haube schauen, um zu verstehen, warum dieser Fehler auftritt, und sehen, wie er behoben werden kann.

2. Das JAVA_HOME- Problem

Nach der Installation von Maven müssen wir die Umgebungsvariable JAVA_HOME festlegen , damit das Tool weiß, wo sich die auszuführenden JDK-Befehle befinden . Maven-Ziele führen die entsprechenden Java-Befehle für den Quellcode des Projekts aus.

Das häufigste Szenario ist beispielsweise das Kompilieren des Codes durch Ausführen des Befehls javac .

Wenn JAVA_HOME nicht auf eine gültige JDK-Installation verweist , gibt Maven bei jeder Ausführung einen Fehler aus:

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 oder JRE

Wie überprüft Maven den JAVA_HOME- Pfad?

Bevor Maven Ziele ausführt, überprüft er das Vorhandensein des Java- Befehls in dem von JAVA_HOME angegebenen Pfad oder fragt das Betriebssystem nach einer Standard-JDK-Installation. Wenn die ausführbare Datei nicht gefunden wird, wird Maven mit dem Fehler beendet.

Hier ist die ausführbare mvn- Prüfung für 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

Diese Überprüfung mag auf den ersten Blick vernünftig erscheinen, aber wir müssen berücksichtigen, dass sowohl JDK als auch JRE einen bin- Ordner haben und beide eine ausführbare Java- Datei enthalten.

Daher ist es möglich, JAVA_HOME so zu konfigurieren, dass es auf eine JRE-Installation verweist , diesen bestimmten Fehler verbirgt und zu einem späteren Zeitpunkt Probleme verursacht. Während der Hauptzweck der JRE darin besteht, Java-Code auszuführen, kann das JDK neben anderen wichtigen Unterschieden auch kompilieren und debuggen .

Aus diesem Grund würde ein Befehl mvn compile fehlschlagen - wie wir im nächsten Unterabschnitt sehen werden.

3.1. Kompilierungsfehler aufgrund von JRE anstelle von JDK

Wie bei den Standardeinstellungen üblich, sind sie sehr hilfreich, wenn wir eine „Standard“ -Konfiguration haben.

Wenn wir beispielsweise Java 11 auf einem Ubuntu 18.04-System installieren und die Umgebungsvariable JAVA_HOME nicht festlegen , findet Maven unser JDK weiterhin gerne und verwendet es für die verschiedenen Ziele, einschließlich des Kompilierens.

Aber wenn wir es geschafft haben, eine nicht standardmäßige Konfiguration (geschweige denn ein Durcheinander) auf unserem System einzurichten, reicht Mavens Hilfsbereitschaft nicht mehr aus. Es kann sogar irreführend sein.

Nehmen wir an, wir haben die folgende Konfiguration unter Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME wurde auf den Pfad der JRE 8-Installation festgelegt

Wenn wir unsere Grundprüfung durchführen:

mvn --version

Wir erhalten eine aussagekräftige Ausgabe wie folgt:

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"

Mal sehen, was passiert, wenn wir versuchen, ein Projekt zu kompilieren:

mvn clean compile

Jetzt erhalten wir eine Fehlermeldung:

[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. Behebung des Kompilierungsfehlers auf Projektebene

Wie in vielen anderen Fällen bei Maven wird empfohlen, sinnvolle systemweite Einstellungen einzurichten. In diesem Fall ändern wir den Wert der Variablen JAVA_HOME wie in Abschnitt 5 beschrieben, um auf das JDK anstelle der JRE zu verweisen.

Wenn wir jedoch aus irgendeinem Grund keine Standardeinstellungen einrichten können, können wir die Einstellungen auf Projektebene dennoch überschreiben. Mal sehen, wie das geht.

Zuerst öffnen wir die pom.xml unseres Projekts, gehen zum Abschnitt build / pluginManagement / plugins und sehen uns den Eintrag für das maven-compiler-plugin an :

 maven-compiler-plugin 3.7.0 

Dann werden wir eine Konfiguration , um es hinzuzufügen , so dass es eine benutzerdefinierte ausführbare Datei verwendet , und fahren Sie für die Suche javac im JAVA_HOME / bin - Verzeichnis:

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

Auf Unix-Systemen sollte diese ausführbare Datei ein Skript mit ausreichender Berechtigung sein. Auf Windows-Systemen sollte es sich um eine EXE- Datei handeln.

Als nächstes werden wir versuchen, das Projekt erneut zu kompilieren:

mvn clean compile

Jetzt ist der Build - einschließlich der Kompilierungsphase mit dem Maven-Compiler-Plugin - erfolgreich.

4. Überprüfen der JAVA_HOME- Konfiguration

Es ist ziemlich einfach zu überprüfen, ob JAVA_HOME auf ein tatsächliches JDK verweist. Wir können entweder den Inhalt in einem Terminal drucken oder einen der folgenden Shell-Befehle ausführen:

4.1. Checking JAVA_HOME on Linux

Just open a terminal and type:

> $JAVA_HOME/bin/javac -version

If JAVA_HOME points to a JDK, the output should look like:

> javac 1.X.0_XX

If JAVA_HOME doesn't point to a JDK, the OS will throw an error message:

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

4.2. Checking JAVA_HOME on Windows

Open a command prompt and type:

%JAVA_HOME%\bin\javac -version

If JAVA_HOME points to a JDK, the output should look like:

> javac 1.X.0_XX

If JAVA_HOME doesn't point to a JDK, the OS will throw an error message:

> The system cannot find the path specified.

5. How to Solve the Issue

First of all, we need to know where to find our JDK:

  • If we installed our JDK distribution using a package installer, we should be able to find the path using the OS search utility
  • If the distribution was a portable one, let's check the folder where we extracted it

Sobald wir den Pfad zum JDK kennen, können wir unsere Umgebungsvariable JAVA_HOME festlegen und dabei die entsprechenden Ergebnisse für unser bestimmtes Betriebssystem verwenden.

6. Fazit

In diesem kurzen Tutorial haben wir den Maven-Fehler " JAVA_HOME sollte auf ein JDK und nicht auf ein JRE verweisen " besprochen und dessen Grundursache untersucht.

Schließlich haben wir erläutert, wie Sie Ihre Umgebungsvariable JAVA_HOME überprüfen und sicherstellen, dass sie auf ein JDK verweist.