JAVA_HOME skal pege på en JDK og ikke en JRE

1. Introduktion

I denne vejledning skal 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 opbygning af kode. Vi ser under emhætten for at forstå, hvorfor denne fejl opstår, og vil se, hvordan vi løser den.

2. Den JAVA_HOME Problem

Efter installation af Maven, vi er nødt til at 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 i forhold til projektets kildekode.

For eksempel er det mest almindelige scenario 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 ... Miljøvariablen JAVA_HOME er ikke defineret korrekt Denne miljøvariabel er nødvendig for at køre dette program NB: JAVA_HOME skal pege på en JDK, ikke en JRE

3. JDK eller JRE

Hvordan verificerer Maven JAVA_HOME sti?

Inden du kører nogen mål, Maven kontrollerer for eksistensen af java kommando i den sti, der er angivet af JAVA_HOME eller ved at bede OS om en standard JDK-installation. Hvis den eksekverbare ikke findes, afsluttes Maven med fejlen.

Her er mvn eksekverbar kontrol for Linux (Apache Maven v3.5.4):

hvis [-z "$ JAVA_HOME"]; derefter JAVACMD = `hvilken java` ellers JAVACMD =" $ JAVA_HOME / bin / java "fi hvis [! -x "$ JAVACMD"]; derefter ekko "Miljøvariablen JAVA_HOME er ikke defineret korrekt"> & 2 ekko "Denne miljøvariabel er nødvendig for at køre dette program"> & 2 ekko "NB: JAVA_HOME skal pege på en JDK ikke en JRE"> & 2 afslut 1 fi

Denne kontrol kan synes rimelig ved første øjekast, men det må vi overveje både JDK og JRE har en beholder 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 JREs hovedformål er at køre Java-kode, JDK kan også kompilere og debugge blandt andre vigtige forskelle.

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

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

Som normalt 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 den til de forskellige mål, herunder kompilering.

Men hvis det er lykkedes os at oprette en ikke-standardkonfiguration (endsige lavet et rod) på vores system, er Mavens hjælpsomhed ikke tilstrækkelig 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 indstil stien til JRE 8-installationen

Hvis vi udfører vores grundlæggende kontrol:

mvn --version

Vi får en meningsfuld output som denne:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18: 41: 47Z) Maven hjem: /opt/apache-maven-3.6.0 Java-version: 1.8.0_191, leverandør: Oracle Corporation, runtime: / usr / lib / jvm / java-8-openjdk-amd64 / jre Standard locale: da, platformskodning: UTF-8 OS-navn: "linux", version: "4.15.0-42-generic", arch: "amd64", family: " unix "

Lad os se, hvad der sker, hvis vi prøver at sammensætte et projekt:

mvn ren kompilering

Nu får vi en fejl:

[FEJL] Kunne ikke udføre mål org.apache.maven.plugins: maven-compiler-plugin: 3.7.0: kompilere (standardkompilering) på projekt-min-app: Kompileringsfejl [FEJL] Ingen kompilator leveres i dette miljø. Måske kører du på en JRE snarere end en JDK?

3.2. Rettelse af kompileringsfejl på projektniveau

Som i mange andre tilfælde med Maven anbefales det at oprette meningsfulde systemindstillinger - 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 ikke kan oprette standardindstillinger af en eller anden grund, Vi kan stadig tilsidesætte indstillingerne på projektniveau. Lad os se, hvordan man gør det.

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

 maven-compiler-plugin 3.7.0 

Derefter vil vi tilføje en konfiguration til den, så den bruger en brugerdefineret eksekverbar og springe søgning efter javac i JAVA_HOME / bin vejviser:

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

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

Dernæst prøver vi at kompilere projektet igen:

mvn ren kompilering

Nu bygger - inklusive kompileringsfasen med maven-compiler-plugin - er vellykket.

4. Kontrol af JAVA_HOME Konfiguration

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

4.1. Kontrol JAVA_HOME på Linux

Bare åbn en terminal og skriv:

> $ JAVA_HOME / bin / javac -version

Hvis JAVA_HOME peger på en JDK, output skal se ud:

> javac 1.X.0_XX

Hvis JAVA_HOME peger ikke på en JDK, OS kaster en fejlmeddelelse:

> bash: / bin / javac: Ingen sådan fil eller mappe

4.2. Kontrol JAVA_HOME på Windows

Åbn en kommandoprompt, og skriv:

% JAVA_HOME% \ bin \ javac -version

Hvis JAVA_HOME peger på en JDK, output skal se ud:

> javac 1.X.0_XX

Hvis JAVA_HOME peger ikke på en JDK, OS kaster en fejlmeddelelse:

> Systemet kan ikke finde den angivne sti.

5. Sådan løses 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, skulle vi være i stand til at finde stien ved hjælp af OS-søgeværktøjet
  • Hvis distributionen var bærbar, lad os kontrollere den mappe, hvor vi ekstraherede den

Når vi først kender stien til JDK, kan vi angive vores JAVA_HOME miljøvariabelved hjælp af de relevante resultater til vores særlige operativsystem.

6. Konklusion

I denne korte vejledning har vi diskuteret “JAVA_HOME skal pege på en JDK ikke en JRE ” Maven-fejl og undersøgte dens grundårsag.

Endelig diskuterede vi, hvordan du kontrollerer din JAVA_HOME miljøvariabel, og hvordan man sørger for, at den peger på en JDK.