Java >> Java tutorial >  >> JDK

JAVA_HOME skal pege på et JDK ikke et JRE

1. Introduktion

I denne tutorial vil vi tale om en undtagelse, som Maven kaster, når den er forkert konfigureret:JAVA_HOME skal pege på en JDK, ikke en JRE.

Maven er et kraftfuldt værktøj til at bygge kode. Vi ser under motorhjelmen for at forstå, hvorfor denne fejl opstår, og vil se, hvordan vi løser den.

2. JAVA_HOME Problem

Efter at have installeret Maven, skal vi indstille JAVA_HOME miljøvariabel, så værktøjet ved, hvor JDK-kommandoerne findes at udføre. Maven-mål kører de relevante Java-kommandoer mod projektets kildekode.

For eksempel er det mest almindelige scenarie at kompilere koden ved at udføre javac kommando.

Hvis JAVA_HOME peger ikke på en gyldig JDK-installation , vil Maven kaste en fejl ved hver udførelse:

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

Hvordan verificerer Maven JAVA_HOME sti?

Før du kører nogen mål, kontrollerer Maven, om java findes kommando i stien specificeret af JAVA_HOME eller ved at bede OS om en standard JDK-installation. Hvis den eksekverbare fil ikke findes, afsluttes Maven med fejlen.

Her er mvn eksekverbar kontrol til 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

Denne kontrol kan virke fornuftig ved første øjekast, men vi er nødt til at overveje, at både JDK og JRE har en bin mappe og begge indeholder en eksekverbar java fil.

Derfor er det muligt at konfigurere JAVA_HOME at pege på en JRE-installation, skjule denne særlige fejl og forårsage problemer på et senere tidspunkt. Mens JRE'ens hovedformål er at køre Java-kode, kan JDK'et også kompilere og debugge  blandt andre vigtige forskelle.

Af denne grund er en mvn-kompilering kommando ville mislykkes – som vi vil se i næste underafsnit.

3.1. Kompilationsfejl på grund af JRE i stedet for JDK

Som sædvanligt med standardindstillinger er de meget nyttige, hvis vi har en "standard" konfiguration.

For eksempel, hvis vi installerer Java 11 på et Ubuntu 18.04-system og ikke indstiller JAVA_HOME miljøvariabel, vil Maven stadig med glæde finde vores JDK og bruge det til de forskellige mål, herunder kompilering.

Men hvis det er lykkedes os at opsætte en ikke-standard konfiguration (endsige lavet rod) på vores system, rækker Mavens hjælpsomhed ikke længere. Det kan endda være vildledende.

Lad os antage, at vi har følgende konfiguration på Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME indstillet til stien til JRE 8-installationen

Hvis vi udfører vores grundlæggende kontrol:

mvn --version

Vi får et meningsfuldt output som dette:

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"

Lad os se, hvad der sker, hvis vi forsøger at kompilere et projekt:

mvn clean compile

Nu får vi en fejlmeddelelse:

[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. Ret kompileringsfejlen på projektniveau

Som i mange andre tilfælde med Maven, anbefales det at konfigurere meningsfulde indstillinger for hele systemet – i dette tilfælde ændrer vi værdien af ​​JAVA_HOME variabel som beskrevet i afsnit 5 for at pege på JDK i stedet for JRE.

Men hvis vi af en eller anden grund ikke kan opsætte standardindstillinger, kan vi stadig tilsidesætte indstillingerne på projektniveau. Lad os se, hvordan man gør det.

Først åbner vi pom.xml i vores projekt, gå til afsnittet build / pluginManagement / plugins og se på indgangen til maven-compiler-plugin :

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
</plugin>

Derefter tilføjer vi en konfiguration til den, så den bruger en brugerdefineret eksekverbar, og springer søgningen efter javac over i JAVA_HOME/bin mappe:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <fork>true</fork>
        <executable>/usr/lib/jvm/java-11-openjdk-amd64/bin/javac</executable>
    </configuration>
</plugin>

På Unix-systemer bør denne eksekverbare være et script med tilstrækkelig tilladelse. På Windows-systemer skal det være en .exe fil.

Dernæst vil vi prøve at kompilere projektet igen:

mvn clean compile

Nu, opbygningen – inklusive kompileringsfasen med maven-compiler-plugin – er vellykket.

4. Kontrollerer JAVA_HOME Konfiguration

Det er ret nemt at tjekke om JAVA_HOME peger på et faktisk JDK. Vi kan enten udskrive dets indhold i en terminal, eller vi kan køre en af ​​følgende shell-kommandoer:

4.1. Kontrollerer JAVA_HOME på Linux

Bare åbn en terminal og skriv:

> $JAVA_HOME/bin/javac -version

Hvis JAVA_HOME peger på et JDK, skal output se sådan ud:

> javac 1.X.0_XX

Hvis JAVA_HOME ikke peger på et JDK, vil operativsystemet sende en fejlmeddelelse:

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

4.2. Kontrollerer JAVA_HOME på Windows

Åbn en kommandoprompt, og skriv:

%JAVA_HOME%\bin\javac -version

Hvis JAVA_HOME peger på et JDK, skal output se sådan ud:

> javac 1.X.0_XX

Hvis JAVA_HOME ikke peger på et JDK, vil operativsystemet sende en fejlmeddelelse:

> The system cannot find the path specified.

5. Sådan løser du problemet

Først og fremmest skal vi vide, hvor vi kan finde vores JDK:

  • Hvis vi installerede vores JDK-distribution ved hjælp af et pakkeinstallationsprogram, bør vi kunne finde stien ved hjælp af OS-søgeværktøjet
  • Hvis distributionen var en bærbar, så lad os tjekke mappen, hvor vi udpakkede den

Når vi kender stien til JDK, kan vi indstille vores JAVA_HOME miljøvariabel , ved at bruge de relevante resultater for vores specifikke OS.

6. Konklusion

I dette korte selvstudie har vi diskuteret "JAVA_HOME skal pege på et JDK ikke et JRE"  Maven fejlede og undersøgte dens grundlæggende årsag.

Til sidst diskuterede vi, hvordan du tjekker dit JAVA_HOME miljøvariabel, og hvordan man sikrer sig, at den peger på et JDK.


Java tag