JAVA_HOME trebao bi ukazivati ​​na JDK, a ne JRE

1. Uvod

U ovom uputstvu govorit ćemo o iznimci koju Maven donosi kada je pogrešno konfigurirana: JAVA_HOME trebao bi ukazivati ​​na JDK, a ne na JRE.

Maven je moćan alat za izgradnju koda. Pogledat ćemo ispod haube kako bismo razumjeli zašto se ova pogreška događa i vidjet ćemo kako je riješiti.

2. The JAVA_KUĆA Problem

Nakon instalacije Mavena, moramo postaviti JAVA_KUĆA varijabla okoline, tako da alat zna gdje pronaći JDK naredbe izvršiti. Ciljevi Mavena pokreću odgovarajuće Java naredbe protiv izvornog koda projekta.

Na primjer, najčešći je scenarij sastavljanje koda izvršavanjem javac naredba.

Ako JAVA_KUĆA ne upućuje na valjanu JDK instalaciju, Maven će bacati pogrešku pri svakom izvršenju:

mvn -version # Output ... Varijabla okruženja JAVA_HOME nije točno definirana Ova varijabla okoline potrebna je za pokretanje ovog programa NB: JAVA_HOME treba ukazivati ​​na JDK, a ne JRE

3. JDK ili JRE

Kako Maven provjerava JAVA_KUĆA staza?

Prije izvođenja bilo kakvih ciljeva, Maven provjerava postoji li Java naredba na putu koji je odredio JAVA_KUĆA ili traženjem od OS-a zadane JDK instalacije. Ako izvršna datoteka nije pronađena, Maven završava s pogreškom.

Ovdje je mvn izvršna provjera za Linux (Apache Maven v3.5.4):

ako [-z "$ JAVA_HOME"]; tada JAVACMD = `koja java` inače JAVACMD =" $ JAVA_HOME / bin / java "fi ako [! -x "$ JAVACMD"]; zatim echo "Varijabla okruženja JAVA_HOME nije točno definirana"> & 2 echo "Ova varijabla okoline potrebna je za pokretanje ovog programa"> & 2 echo "NB: JAVA_HOME treba ukazivati ​​na JDK, a ne JRE"> & 2 izlaz 1 fi

Ova se provjera na prvi pogled može činiti razumnom, ali to moramo uzeti u obzir i JDK i JRE imaju kanta za smeće mapa i obje sadrže izvršnu datoteku Java datoteka.

Stoga je moguće konfigurirati JAVA_KUĆA ukazati na JRE instalaciju, skrivajući ovu određenu pogrešku i uzrokujući probleme u kasnijoj fazi. Iako je glavna svrha JRE pokretanje Java koda, JDK također može kompajlirati i ispraviti pogreške između ostalih važnih razlika.

Iz tog razloga, an mvn sastaviti naredba ne bi uspjela - kao što ćemo vidjeti u sljedećem pododjeljku.

3.1. Neuspjeh kompilacije zbog JRE umjesto JDK

Kao i obično kod zadanih postavki, vrlo su korisne ako imamo "standardnu" konfiguraciju.

Na primjer, ako instaliramo Javu 11 na sustav Ubuntu 18.04 i ne postavimo JAVA_KUĆA varijabla okoline, Maven će i dalje rado pronaći naš JDK i koristiti ga za različite ciljeve, uključujući kompajliranje.

Ali ako smo uspjeli postaviti nestandardnu ​​konfiguraciju (a kamoli napraviti nered) na našem sustavu, Mavenova uslužnost više nije dovoljna. To čak može zavarati.

Pretpostavimo da na Ubuntu 18.04 imamo sljedeću konfiguraciju:

  • JDK 11
  • JRE 8
  • JAVA_KUĆA postavljen na put instalacije JRE 8

Ako obavimo osnovnu provjeru:

mvn --verzija

Dobit ćemo smislen rezultat poput ovog:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18: 41: 47Z) Maven home: /opt/apache-maven-3.6.0 Java verzija: 1.8.0_191, dobavljač: Oracle Corporation, runtime: / usr / lib / jvm / java-8-openjdk-amd64 / jre Zadana lokalizacija: hr, kodiranje platforme: UTF-8 Naziv OS-a: "linux", verzija: "4.15.0-42-generički", luk: "amd64", obitelj: " unix "

Pogledajmo što će se dogoditi ako pokušamo sastaviti projekt:

mvn čista kompilacija

Sada dobivamo pogrešku:

[POGREŠKA] Nije uspjelo izvršiti cilj org.apache.maven.plugins: maven-compiler-plugin: 3.7.0: compile (default-compile) na projektu my-app: Neuspjeh kompilacije [GREŠKA] U ovom okruženju nije dostupan kompajler. Možda trčite na JRE, a ne na JDK?

3.2. Ispravljanje pogreške kompilacije na razini projekta

Kao i u mnogim drugim slučajevima s Mavenom, preporučuje se postavljanje značajnih postavki za cijeli sustav - u ovom ćemo slučaju promijeniti vrijednost JAVA_KUĆA varijabla kako je opisano u odjeljku 5 kako bi usmjerila na JDK umjesto na JRE.

Međutim, ako iz bilo kojeg razloga ne možemo postaviti zadane vrijednosti, još uvijek možemo poništiti postavke na razini projekta. Pogledajmo kako to učiniti.

Prvo ćemo otvoriti pom.xml našeg projekta, idite na odjeljak build / pluginManagement / dodaci i pogledajte unos za maven-compiler-plugin:

 maven-compiler-plugin 3.7.0 

Zatim ćemo joj dodati konfiguraciju tako da koristi prilagođenu izvršnu datoteku i preskočiti traženje javac u JAVA_HOME / bin imenik:

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

Na Unix sustavima ova bi izvršna datoteka trebala biti skripta s odgovarajućim dopuštenjem. Na Windows sustavima to bi trebao biti .exe datoteka.

Dalje, pokušat ćemo ponovno sastaviti projekt:

mvn čista kompilacija

Sada, izgradnja - uključujući fazu kompajliranja s maven-compiler-plugin - je uspješno.

4. Provjera JAVA_KUĆA Konfiguracija

Prilično je jednostavno provjeriti je li JAVA_KUĆA ukazuje na stvarni JDK. Sadržaj možemo ispisati u terminalu ili pokrenuti jednu od sljedećih naredbi ljuske:

4.1. Provjeravanje JAVA_KUĆA na Linuxu

Samo otvorite terminal i upišite:

> $ JAVA_HOME / bin / javac -verzija

Ako JAVA_KUĆA upućuje na JDK, izlaz bi trebao izgledati ovako:

> javac 1.X.0_XX

Ako JAVA_KUĆA ne pokazuje na JDK, OS će poslati poruku o pogrešci:

> bash: / bin / javac: Nema takve datoteke ili direktorija

4.2. Provjeravanje JAVA_KUĆA na Windowsima

Otvorite naredbeni redak i upišite:

% JAVA_HOME% \ bin \ javac -verzija

Ako JAVA_KUĆA upućuje na JDK, izlaz bi trebao izgledati ovako:

> javac 1.X.0_XX

Ako JAVA_KUĆA ne pokazuje na JDK, OS će poslati poruku o pogrešci:

> Sustav ne može pronaći navedenu stazu.

5. Kako riješiti problem

Prije svega, moramo znati gdje pronaći naš JDK:

  • Ako smo našu JDK distribuciju instalirali pomoću instalacijskog programa paketa, trebali bismo moći pronaći put pomoću uslužnog programa za pretraživanje OS-a
  • Ako je distribucija bila prijenosna, provjerimo mapu u kojoj smo je izdvojili

Jednom kada znamo put do JDK, možemo postaviti svoj JAVA_KUĆA varijabla okoline, koristeći odgovarajuće rezultate za naš određeni OS.

6. Zaključak

U ovom kratkom vodiču razgovarali smo o “JAVA_HOME trebao bi ukazivati ​​na JDK, a ne JRE ” Mavenova pogreška i ispitao njezin glavni uzrok.

Na kraju smo razgovarali o načinu provjere vašeg JAVA_KUĆA varijabla okoline i kako osigurati da usmjerava na JDK.