JAVA_HOME by mal ukazovať na JDK, nie na JRE

1. Úvod

V tomto výučbe sa budeme rozprávať o výnimke, ktorú Maven hodí pri nesprávnej konfigurácii: JAVA_HOME by mal ukazovať na JDK, nie na JRE.

Maven je mocný nástroj na tvorbu kódu. Pozrime sa pod kapotu, aby sme pochopili, prečo sa táto chyba vyskytuje, a uvidíme, ako ju vyriešiť.

2. The JAVA_HOME Problém

Po inštalácii Maven, musíme nastaviť JAVA_HOME premenná prostredia, takže nástroj vie, kde nájde príkazy JDK vykonať. Ciele Maven spúšťajú príslušné príkazy Java proti zdrojovému kódu projektu.

Najbežnejším scenárom je napríklad kompilácia kódu vykonaním príkazu javac príkaz.

Ak JAVA_HOME neukazuje na platnú inštaláciu JDK, Maven vyhodí chybu pri každom spustení:

mvn -version # Výstup ... Premenná prostredia JAVA_HOME nie je správne definovaná. Táto premenná prostredia je potrebná na spustenie tohto programu. POZNÁMKA: JAVA_HOME by mal smerovať na JDK, nie na JRE

3. JDK alebo JRE

Ako Maven overuje JAVA_HOME cesta?

Pred dosiahnutím akýchkoľvek cieľov Maven kontroluje existenciu java príkaz v ceste určenej JAVA_HOME alebo požiadaním OS o predvolenú inštaláciu JDK. Ak sa spustiteľný súbor nenájde, program Maven sa chybou ukončí.

Tu je mvn spustiteľná kontrola pre Linux (Apache Maven v3.5.4):

if [-z "$ JAVA_HOME"]; potom JAVACMD = `which java` else JAVACMD =" $ JAVA_HOME / bin / java "fi if [! -x "$ JAVACMD"]; potom echo "Premenná prostredia JAVA_HOME nie je správne definovaná"> & 2 echo "Táto premenná prostredia je potrebná na spustenie tohto programu"> & 2 echo "Pozn .: JAVA_HOME by mal ukazovať na JDK nie na JRE"> & 2 výstup 1 fi

Táto kontrola sa na prvý pohľad môže javiť ako rozumná, musíme to však zvážiť aj JDK aj JRE majú a kôš priečinok a oba obsahujú spustiteľný súbor java spis.

Preto je možné konfigurovať JAVA_HOME aby ukázal na inštaláciu JRE, skryl túto konkrétnu chybu a spôsobil problémy v neskoršej fáze. Aj keď hlavným účelom JRE je spúšťanie Java kódu, JDK môže tiež kompilovať a ladiť okrem iných dôležitých rozdielov.

Z tohto dôvodu, an mvn zostaviť príkaz by zlyhal - ako uvidíme v nasledujúcej podsekcii.

3.1. Zlyhanie kompilácie kvôli JRE namiesto JDK

Ako býva zvykom pri predvolených nastaveniach, sú veľmi užitočné, ak máme „štandardnú“ konfiguráciu.

Napríklad, ak nainštalujeme Java 11 na systém Ubuntu 18.04 a nenastavíte JAVA_HOME premenná prostredia, Maven stále našťastie nájde náš JDK a použije ho na rôzne ciele vrátane kompilácie.

Ale ak sa nám v našom systéme podarilo nastaviť neštandardnú konfiguráciu (nehovoriac o neporiadku), Mavenova ústretovosť už nestačí. Môže to byť dokonca zavádzajúce.

Predpokladajme, že máme v Ubuntu 18.04 nasledujúcu konfiguráciu:

  • JDK 11
  • 8. JRE
  • JAVA_HOME nastavený na cestu inštalácie JRE 8

Ak urobíme našu základnú kontrolu:

mvn --verzia

Získame zmysluplný výstup, ako je tento:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18: 41: 47Z) Domovská stránka Maven: /opt/apache-maven-3.6.0 Java verzia: 1.8.0_191, dodávateľ: Oracle Corporation, runtime: / usr / lib / jvm / java-8-openjdk-amd64 / jre Predvolené miestne nastavenie: en, kódovanie platformy: UTF-8 Názov OS: "linux", verzia: "4.15.0-42-generic", arch: "amd64", rodina: " unix “

Pozrime sa, čo sa stane, keď sa pokúsime zostaviť projekt:

mvn čistý kompilát

Teraz sa zobrazí chyba:

[CHYBA] Nepodarilo sa uskutočniť cieľ org.apache.maven.plugins: maven-compiler-plugin: 3.7.0: kompilácia (predvolená kompilácia) v projekte moja aplikácia: Zlyhanie kompilácie [CHYBA] V tomto prostredí nie je k dispozícii žiadny kompilátor. Možno používate skôr JRE ako JDK?

3.2. Oprava chyby kompilácie na úrovni projektu

Rovnako ako v mnohých iných prípadoch s programom Maven, aj v tomto prípade sa odporúča vykonať zmysluplné nastavenia pre celý systém - v takom prípade zmeníme hodnotu JAVA_HOME premenná, ako je popísané v časti 5, aby ukazovala na JDK namiesto na JRE.

Ak však z nejakého dôvodu nemôžeme nastaviť predvolené hodnoty, stále môžeme prepísať nastavenia na úrovni projektu. Pozrime sa, ako na to.

Najskôr otvoríme pom.xml nášho projektu, choďte do sekcie build / pluginManagement / pluginy a pozrite sa na záznam pre maven-compiler-plugin:

 maven-compiler-plugin 3.7.0 

Potom k nej pridáme konfiguráciu, aby používala vlastný spustiteľný súbor, a preskočí vyhľadávanie javac v JAVA_HOME / bin adresár:

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

V systémoch Unix by tento spustiteľný súbor mal byť skript s príslušným povolením. V systémoch Windows by to malo byť .exe spis.

Ďalej sa pokúsime zostaviť projekt znova:

mvn čistý kompilát

Teraz je zostava - vrátane fázy kompilácie s maven-compiler-plugin - je úspešný.

4. Kontrola JAVA_HOME Konfigurácia

Je to celkom jednoduché skontrolujte či JAVA_HOME ukazuje na skutočnú JDK. Môžeme buď vytlačiť jeho obsah v termináli, alebo môžeme spustiť jeden z nasledujúcich príkazov shellu:

4.1. Prebieha kontrola JAVA_HOME v systéme Linux

Stačí otvoriť terminál a napísať:

> $ JAVA_HOME / bin / javac -verzia

Ak JAVA_HOME ukazuje na JDK, výstup by mal vyzerať takto:

> javac 1.X.0_XX

Ak JAVA_HOME neukazuje na JDK, OS vyhodí chybové hlásenie:

> bash: / bin / javac: Žiadny takýto súbor alebo adresár

4.2. Prebieha kontrola JAVA_HOME vo Windows

Otvorte príkazový riadok a zadajte:

% JAVA_HOME% \ bin \ javac -verzia

Ak JAVA_HOME ukazuje na JDK, výstup by mal vyzerať takto:

> javac 1.X.0_XX

Ak JAVA_HOME neukazuje na JDK, OS vyhodí chybové hlásenie:

> Systém nemôže nájsť zadanú cestu.

5. Ako vyriešiť problém

Najskôr musíme vedieť, kde nájsť náš JDK:

  • Ak sme našu distribúciu JDK nainštalovali pomocou inštalátora balíkov, mali by sme byť schopní nájsť cestu pomocou vyhľadávacieho nástroja OS
  • Ak bola distribúcia prenosná, skontrolujte priečinok, kde sme ju extrahovali

Keď poznáme cestu k JDK, môžeme nastaviť našu JAVA_HOME premenná prostredia, s použitím vhodných výsledkov pre náš konkrétny OS.

6. Záver

V tomto krátkom tutoriáli sme diskutovali o „JAVA_HOME by mal ukazovať na JDK, nie na JRE “ Chyba Maven a preskúmala sa jej hlavná príčina.

Nakoniec sme diskutovali o tom, ako skontrolovať vaše JAVA_HOME premenná prostredia a ako zabezpečiť, aby smerovala na JDK.


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