JAVA__HOME sollte auf ein JDK und nicht auf ein JRE zeigen

JAVA_HOME sollte auf ein JDK und nicht auf eine JRE verweisen

1. Einführung

In diesem Tutorial werden wir über eine Ausnahme sprechen, die Maven bei einer Fehlkonfiguration auslöst:JAVA_HOME should point to a JDK, not a JRE.

Maven ist ein leistungsstarkes Tool zum Erstellen von Code. Wir werden einen Blick hinter die Kulissen werfen, um zu verstehen, warum dieser Fehler auftritt und wie er behoben werden kann.

2. DasJAVA_HOME Problem

Nach der Installation von Maven müssenwe have to set the JAVA_HOME environment variable, so the tool knows where to find the JDK commands ausgeführt werden. 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 Befehlsjavac.

WennJAVA_HOME is not pointing to a valid JDK installation, 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 Pfad vonJAVA_HOME?

Bevor Sie Ziele ausführen, müssen SieMaven checks for the existence of the java command in dem durchJAVA_HOME angegebenen Pfad eingeben oder das Betriebssystem nach einer Standard-JDK-Installation fragen. If the executable is not found, Maven terminates with the error.

Hier ist die ausführbare Prüfung vonmvnfü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 Prüfung mag auf den ersten Blick vernünftig erscheinen, aber wir müssenboth JDK and JRE have a bin folder and both contain an executable java file. berücksichtigen

Daher ist espossible to configure JAVA_HOME to point to a JRE installation, hiding this particular error and causing problems at a later stage. Während der Hauptzweck der JRE darin besteht, Java-Code auszuführen, istthe JDK can also compile and debug among other important differences.

Aus diesem Grund würde einmvn compile-Befehl 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 UmgebungsvariableJAVA_HOMEnicht festlegen, findet Maven unser JDK weiterhin gerne und verwendet es für die verschiedenen Ziele, einschließlich des Kompilierens.

Wenn es uns jedoch gelungen ist, 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 unter Ubuntu 18.04 die folgende Konfiguration:

  • JDK 11

  • JRE 8

  • JAVA_HOME wird auf den Pfad der JRE 8-Installation gesetzt

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 bekommen wir einen Fehler:

[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 vorzunehmen. In diesem Fall ändern wir den Wert der VariablenJAVA_HOME wie in Abschnitt 5 beschrieben, um auf das JDK anstelle des zu verweisen JRE.

Wenn wir jedoch aus irgendeinem Grund keine Standardeinstellungen einrichten können, sehen wir unswe can still override the settings on the project level. an.

Zuerst öffnen wir diepom.xml unseres Projekts, gehen zum Abschnittbuild / pluginManagement / plugins und sehen uns den Eintrag für diemaven-compiler-plugin an:


    maven-compiler-plugin
    3.7.0

Anschließend fügen wir eine Konfiguration hinzu, sodass eine benutzerdefinierte ausführbare Datei verwendet wird, und überspringen die Suche nachjavac im VerzeichnisJAVA_HOME/bin:


    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 entsprechenden Berechtigungen 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 mitmaven-compiler-plugin - erfolgreich.

4. Überprüfen derJAVA_HOME Konfiguration

check if JAVA_HOME points to an actual JDK. Es ist ziemlich einfach. Wir können entweder den Inhalt in einem Terminal drucken oder einen der folgenden Shell-Befehle ausführen:

4.1. Überprüfen vonJAVA_HOME unter Linux

Öffnen Sie einfach ein Terminal und geben Sie Folgendes ein:

> $JAVA_HOME/bin/javac -version

WennJAVA_HOME auf ein JDK zeigt, sollte die Ausgabe folgendermaßen aussehen:

> javac 1.X.0_XX

WennJAVA_HOME nicht auf ein JDK verweist, gibt das Betriebssystem eine Fehlermeldung aus:

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

4.2. JAVA_HOME unter Windows überprüfen

Öffnen Sie eine Eingabeaufforderung und geben Sie Folgendes ein:

%JAVA_HOME%\bin\javac -version

WennJAVA_HOME auf ein JDK zeigt, sollte die Ausgabe folgendermaßen aussehen:

> javac 1.X.0_XX

WennJAVA_HOME nicht auf ein JDK verweist, gibt das Betriebssystem eine Fehlermeldung aus:

> The system cannot find the path specified.

5. So lösen Sie das Problem

Zunächst müssen wir wissen, wo wir unser JDK finden können:

  • Wenn wir unsere JDK-Distribution mithilfe eines Paketinstallationsprogramms installiert haben, sollten wir den Pfad mithilfe des Dienstprogramms zur Betriebssystemsuche finden können

  • Wenn es sich um eine tragbare Distribution handelt, überprüfen wir den Ordner, in den wir sie extrahiert haben

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

6. Fazit

In diesem kurzen Tutorial haben wir den "JAVA_HOME should point to a JDK not a JRE” Maven-Fehler" besprochen und seine Grundursache untersucht.

Schließlich haben wir besprochen, wie Sie die UmgebungsvariableJAVA_HOMEüberprüfen und sicherstellen, dass sie auf ein JDK verweist.