JAVA_HOME skal peke på en JDK, ikke en JRE

1. Introduksjon

I denne opplæringen skal vi snakke om et unntak som Maven kaster når det er feilkonfigurert: JAVA_HOME skal peke på en JDK, ikke en JRE.

Maven er et kraftig verktøy for å bygge kode. Vi vil se under panseret for å forstå hvorfor denne feilen oppstår, og se hvordan vi kan løse den.

2. Den JAVA_HOME Problem

Etter installasjon av Maven, vi må stille inn JAVA_HOME miljøvariabel, slik at verktøyet vet hvor du finner JDK-kommandoene å henrette. Maven-mål kjører de riktige Java-kommandoene mot prosjektets kildekode.

For eksempel er det vanligste scenariet å kompilere koden ved å utføre javac kommando.

Hvis JAVA_HOME peker ikke på en gyldig JDK-installasjon, Vil Maven kaste en feil ved hver utførelse:

mvn -version # Output ... Miljøvariabelen JAVA_HOME er ikke definert riktig. Denne miljøvariabelen er nødvendig for å kjøre dette programmet. NB: JAVA_HOME skal peke på en JDK, ikke en JRE

3. JDK eller JRE

Hvordan verifiserer Maven JAVA_HOME sti?

Før du kjører noen mål, Maven sjekker for eksistensen av java kommando i banen spesifisert av JAVA_HOME eller ved å be OS om en standard JDK-installasjon. Hvis den kjørbare filen ikke blir funnet, avsluttes Maven med feilen.

Her er mvn kjørbar sjekk for Linux (Apache Maven v3.5.4):

hvis [-z "$ JAVA_HOME"]; deretter JAVACMD = `hvilken java` ellers JAVACMD =" $ JAVA_HOME / bin / java "fi hvis [! -x "$ JAVACMD"]; deretter ekko "JAVA_HOME miljøvariabelen er ikke definert riktig"> & 2 ekko "Denne miljøvariabelen er nødvendig for å kjøre dette programmet"> & 2 ekko "NB: JAVA_HOME skal peke på en JDK ikke en JRE"> & 2 exit 1 fi

Denne sjekken kan virke rimelig ved første øyekast, men vi må vurdere det både JDK og JRE har en søppel mappen og begge inneholder en kjørbar java fil.

Derfor er det mulig å konfigurere JAVA_HOME å peke på en JRE-installasjon, skjule denne spesielle feilen og forårsake problemer på et senere tidspunkt. Mens JREs hovedformål er å kjøre Java-kode, JDK kan også kompilere og feilsøke blant andre viktige forskjeller.

Av denne grunn an mvn kompilere kommandoen mislyktes - som vi vil se i neste underavsnitt.

3.1. Kompileringsfeil på grunn av JRE i stedet for JDK

Som vanlig med standardinnstillinger, er de veldig nyttige hvis vi har en "standard" konfigurasjon.

For eksempel hvis vi installerer Java 11 på et Ubuntu 18.04-system og ikke setter JAVA_HOME miljøvariabel, vil Maven fremdeles lykkelig finne vår JDK og bruke den til de forskjellige målene, inkludert kompilering.

Men hvis vi har klart å sette opp en ikke-standard konfigurasjon (enn si gjort et rot) på systemet vårt, er ikke Mavens hjelpsomhet tilstrekkelig lenger. Det kan til og med være misvisende.

La oss anta at vi har følgende konfigurasjon på Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME sett til banen for JRE 8-installasjonen

Hvis vi gjør vår grunnleggende sjekk:

mvn --versjon

Vi får en meningsfull utgang som dette:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18: 41: 47Z) Maven hjem: /opt/apache-maven-3.6.0 Java-versjon: 1.8.0_191, leverandør: Oracle Corporation, kjøretid: / usr / lib / jvm / java-8-openjdk-amd64 / jre Standard lokalitet: no, plattformskoding: UTF-8 OS-navn: "linux", versjon: "4.15.0-42-generic", bue: "amd64", familie: " unix "

La oss se hva som skjer hvis vi prøver å kompilere et prosjekt:

mvn ren kompilering

Nå får vi en feil:

[FEIL] Kunne ikke utføre mål org.apache.maven.plugins: maven-compiler-plugin: 3.7.0: kompilere (standardkompilering) på prosjekt-min-app: Kompileringsfeil [FEIL] Ingen kompilator er gitt i dette miljøet. Kanskje du kjører på en JRE i stedet for en JDK?

3.2. Å fikse kompileringsfeilen på prosjektnivå

Som i mange andre tilfeller med Maven, anbefales det å sette opp meningsfulle systemomfattende innstillinger - i dette tilfellet vil vi endre verdien på JAVA_HOME variabel som beskrevet i avsnitt 5 for å peke på JDK i stedet for JRE.

Men hvis vi ikke kan konfigurere standarder av en eller annen grunn, vi kan fortsatt overstyre innstillingene på prosjektnivå. La oss se hvordan vi gjør det.

Først åpner vi pom.xml av prosjektet vårt, gå til seksjonen build / pluginManagement / plugins og ta en titt på oppføringen for maven-compiler-plugin:

 maven-compiler-plugin 3.7.0 

Deretter legger vi til en konfigurasjon til den slik at den bruker en tilpasset kjørbar og hopper over å søke etter javac i JAVA_HOME / søppel katalog:

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

På Unix-systemer skal denne kjørbare filen være et skript med tilstrekkelig tillatelse. På Windows-systemer bør det være en .ekse fil.

Deretter prøver vi å kompilere prosjektet igjen:

mvn ren kompilering

Nå, bygge - inkludert kompileringsfasen med maven-compiler-plugin - er vellykket.

4. Kontroll av JAVA_HOME Konfigurasjon

Det er ganske enkelt å sjekk om JAVA_HOME peker på en faktisk JDK. Vi kan enten skrive ut innholdet i en terminal, eller vi kan kjøre en av følgende skallkommandoer:

4.1. Sjekker JAVA_HOME på Linux

Bare åpne en terminal og skriv:

> $ JAVA_HOME / bin / javac -versjon

Hvis JAVA_HOME peker på en JDK, skal utgangen se ut som:

> javac 1.X.0_XX

Hvis JAVA_HOME peker ikke på en JDK, OS vil kaste en feilmelding:

> bash: / bin / javac: Ingen slik fil eller katalog

4.2. Sjekker JAVA_HOME på Windows

Åpne en ledetekst og skriv:

% JAVA_HOME% \ bin \ javac -versjon

Hvis JAVA_HOME peker på en JDK, skal utgangen se ut som:

> javac 1.X.0_XX

Hvis JAVA_HOME peker ikke på en JDK, OS vil kaste en feilmelding:

> Systemet finner ikke den spesifiserte banen.

5. Hvordan løse problemet

Først og fremst må vi vite hvor vi finner JDK:

  • Hvis vi installerte JDK-distribusjonen vår ved hjelp av et pakkeinstallasjonsprogram, bør vi kunne finne banen ved hjelp av OS-søkeverktøyet
  • Hvis distribusjonen var bærbar, la oss sjekke mappen der vi hentet den

Når vi kjenner veien til JDK, kan vi angi vår JAVA_HOME miljøvariabel, ved å bruke de riktige resultatene for vårt spesielle operativsystem.

6. Konklusjon

I denne korte opplæringen har vi diskutert “JAVA_HOME skal peke på en JDK ikke en JRE ” Maven feil og undersøkte årsaken.

Til slutt diskuterte vi hvordan du sjekker din JAVA_HOME miljøvariabel, og hvordan du sørger for at den peker mot en JDK.


$config[zx-auto] not found$config[zx-overlay] not found