JAVA_HOME zou moeten verwijzen naar een JDK en niet naar een JRE

1. Inleiding

In deze zelfstudie gaan we het hebben over een uitzondering die Maven genereert wanneer deze verkeerd is geconfigureerd: JAVA_HOME zou naar een JDK moeten verwijzen, niet naar een JRE.

Maven is een krachtig hulpmiddel voor het bouwen van code. We zullen onder de motorkap kijken om te begrijpen waarom deze fout optreedt en zullen zien hoe we deze kunnen oplossen.

2. Het JAVA_HOME Probleem

Na het installeren van Maven, we moeten de JAVA_HOME omgevingsvariabele, zodat de tool weet waar hij de JDK-opdrachten kan vinden uitvoeren. Maven-doelen voeren de juiste Java-opdrachten uit tegen de broncode van het project.

Het meest voorkomende scenario is bijvoorbeeld om de code te compileren door het Javac opdracht.

Als JAVA_HOME verwijst niet naar een geldige JDK-installatie, Zal Maven een foutmelding geven bij elke uitvoering:

mvn -version # Output ... De omgevingsvariabele JAVA_HOME is niet correct gedefinieerd Deze omgevingsvariabele is nodig om dit programma te draaien NB: JAVA_HOME moet verwijzen naar een JDK, niet naar een JRE

3. JDK of JRE

Hoe verifieert Maven het JAVA_HOME pad?

Voordat u doelen gaat stellen, Maven controleert het bestaan ​​van de Java opdracht in het pad gespecificeerd door JAVA_HOME of door het besturingssysteem te vragen om een ​​standaard JDK-installatie. Als het uitvoerbare bestand niet wordt gevonden, eindigt Maven met de fout.

Hier is de mvn uitvoerbare controle voor Linux (Apache Maven v3.5.4):

if [-z "$ JAVA_HOME"]; dan JAVACMD = `welke java` anders JAVACMD =" $ JAVA_HOME / bin / java "fi if [! -x "$ JAVACMD"]; then echo "De omgevingsvariabele JAVA_HOME is niet correct gedefinieerd"> & 2 echo "Deze omgevingsvariabele is nodig om dit programma uit te voeren"> & 2 echo "NB: JAVA_HOME moet verwijzen naar een JDK, niet een JRE"> & 2 exit 1 fi

Deze controle lijkt op het eerste gezicht misschien redelijk, maar daar moeten we rekening mee houden zowel JDK als JRE hebben een bak map en beide bevatten een uitvoerbaar Java het dossier.

Daarom is het mogelijk om te configureren JAVA_HOME om naar een JRE-installatie te verwijzen, deze specifieke fout te verbergen en in een later stadium problemen te veroorzaken. Hoewel het hoofddoel van de JRE is om Java-code uit te voeren, de JDK kan ook compileren en debuggen onder andere belangrijke verschillen.

Om deze reden is een mvn compileren commando zou mislukken - zoals we zullen zien in de volgende subsectie.

3.1. Compilatiefout vanwege JRE in plaats van JDK

Zoals gebruikelijk met standaardinstellingen, zijn ze erg handig als we een 'standaard'-configuratie hebben.

Als we bijvoorbeeld Java 11 op een Ubuntu 18.04-systeem installeren en de JAVA_HOME omgevingsvariabele, zal Maven nog steeds graag onze JDK vinden en deze gebruiken voor de verschillende doelen, inclusief compileren.

Maar als het ons is gelukt om een ​​niet-standaard configuratie op te zetten (laat staan ​​een puinhoop gemaakt) op ons systeem, is de hulpvaardigheid van Maven niet meer voldoende. Het kan zelfs misleidend zijn.

Laten we aannemen dat we de volgende configuratie hebben op Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME ingesteld op het pad van de JRE 8-installatie

Als we onze basiscontrole uitvoeren:

mvn --version

We krijgen een zinvolle output als deze:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18: 41: 47Z) Maven home: /opt/apache-maven-3.6.0 Java-versie: 1.8.0_191, leverancier: Oracle Corporation, runtime: / usr / lib / jvm / java-8-openjdk-amd64 / jre Standaard landinstelling: en, platformcodering: UTF-8 OS-naam: "linux", versie: "4.15.0-42-generiek", arch: "amd64", familie: " unix "

Laten we eens kijken wat er gebeurt als we proberen een project te compileren:

mvn schoon compileren

Nu krijgen we een foutmelding:

[FOUT] Kan doel org.apache.maven.plugins niet uitvoeren: maven-compiler-plugin: 3.7.0: compileren (standaardcompileren) op project mijn-app: Compilatiefout [FOUT] Er is geen compiler beschikbaar in deze omgeving. Misschien gebruikt u een JRE in plaats van een JDK?

3.2. De compilatiefout op projectniveau oplossen

Zoals in veel andere gevallen met Maven, wordt het aanbevolen om zinvolle systeembrede instellingen in te stellen - in dit geval zullen we de waarde van de JAVA_HOME variabele zoals beschreven in sectie 5 om te verwijzen naar de JDK in plaats van de JRE.

Als we om wat voor reden dan ook geen standaardinstellingen kunnen instellen, we kunnen nog steeds de instellingen op projectniveau overschrijven. Laten we eens kijken hoe we dat moeten doen.

Eerst openen we het pom.xml van ons project, ga naar de sectie build / pluginManagement / plugins en bekijk de vermelding voor de maven-compiler-plugin:

 maven-compiler-plugin 3.7.0 

Vervolgens zullen we er een configuratie aan toevoegen zodat het een aangepast uitvoerbaar bestand gebruikt en het zoeken naar Javac in de JAVA_HOME / bin directory:

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

Op Unix-systemen moet dit uitvoerbare bestand een script zijn met voldoende toestemming. Op Windows-systemen zou het een .exe het dossier.

Vervolgens proberen we het project opnieuw te compileren:

mvn schoon compileren

Nu, de build - inclusief de compilatiefase met de maven-compiler-plugin - is succesvol.

4. Controleer het JAVA_HOME Configuratie

Het is vrij eenvoudig om controleer of JAVA_HOME verwijst naar een echte JDK. We kunnen de inhoud ervan in een terminal afdrukken, of we kunnen een van de volgende shell-opdrachten uitvoeren:

4.1. Controleren JAVA_HOME op Linux

Open gewoon een terminal en typ:

> $ JAVA_HOME / bin / javac -versie

Als JAVA_HOME verwijst naar een JDK, de uitvoer zou er als volgt uit moeten zien:

> javac 1.X.0_XX

Als JAVA_HOME wijst niet naar een JDK, zal het besturingssysteem een ​​foutmelding geven:

> bash: / bin / javac: bestand of map bestaat niet

4.2. Controleren JAVA_HOME op Windows

Open een opdrachtprompt en typ:

% JAVA_HOME% \ bin \ javac -versie

Als JAVA_HOME verwijst naar een JDK, de uitvoer zou er als volgt uit moeten zien:

> javac 1.X.0_XX

Als JAVA_HOME wijst niet naar een JDK, zal het besturingssysteem een ​​foutmelding geven:

> Het systeem kan het opgegeven pad niet vinden.

5. Hoe u het probleem kunt oplossen

Allereerst moeten we weten waar we onze JDK kunnen vinden:

  • Als we onze JDK-distributie hebben geïnstalleerd met behulp van een pakketinstallatieprogramma, zouden we het pad moeten kunnen vinden met behulp van het OS-zoekprogramma
  • Als de distributie een draagbare was, laten we de map controleren waarin we deze hebben uitgepakt

Zodra we het pad naar de JDK kennen, kunnen we onze JAVA_HOME omgevingsvariabele, met behulp van de juiste resultaten voor ons specifieke besturingssysteem.

6. Conclusie

In deze korte tutorial hebben we de "JAVA_HOME zou moeten verwijzen naar een JDK en niet naar een JRE " Maven-fout en onderzocht de hoofdoorzaak.

Ten slotte hebben we besproken hoe u uw JAVA_HOME omgevingsvariabele, en hoe u ervoor kunt zorgen dat deze naar een JDK verwijst.