JAVA_HOME harus mengarah ke JDK, bukan JRE

1. Perkenalan

Dalam tutorial ini, kita akan berbicara tentang pengecualian yang Maven berikan ketika salah konfigurasi: JAVA_HOME harus mengarah ke JDK, bukan JRE.

Maven adalah alat yang ampuh untuk membuat kode. Kami akan melihat di balik terpal untuk memahami mengapa kesalahan ini terjadi dan akan melihat cara mengatasinya.

2. Masalah JAVA_HOME

Setelah menginstal Maven, kita harus menyetel variabel lingkungan JAVA_HOME , sehingga alat tersebut tahu di mana menemukan perintah JDK untuk dijalankan. Sasaran Maven menjalankan perintah Java yang sesuai dengan kode sumber proyek.

Misalnya, skenario paling umum adalah mengompilasi kode dengan menjalankan perintah javac .

Jika JAVA_HOME tidak menunjuk ke instalasi JDK yang valid , Maven akan memberikan kesalahan pada setiap eksekusi:

mvn -version # Output...  The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK, not a JRE

3. JDK atau JRE

Bagaimana cara Maven memverifikasi jalur JAVA_HOME ?

Sebelum menjalankan tujuan apa pun, Maven memeriksa keberadaan perintah java di jalur yang ditentukan oleh JAVA_HOME atau dengan meminta OS untuk memasang JDK default. Jika eksekusi tidak ditemukan, Maven diakhiri dengan kesalahan.

Berikut adalah pemeriksaan yang dapat dieksekusi mvn untuk Linux (Apache Maven v3.5.4):

if [ -z "$JAVA_HOME" ] ; then JAVACMD=`which java` else JAVACMD="$JAVA_HOME/bin/java" fi   if [ ! -x "$JAVACMD" ] ; then echo "The JAVA_HOME environment variable is not defined correctly" >&2 echo "This environment variable is needed to run this program" >&2 echo "NB: JAVA_HOME should point to a JDK not a JRE" >&2 exit 1 fi

Pemeriksaan ini mungkin tampak masuk akal pada pandangan pertama, tetapi kita harus mempertimbangkan bahwa JDK dan JRE memiliki folder bin dan keduanya berisi file java yang dapat dieksekusi .

Oleh karena itu, dimungkinkan untuk mengkonfigurasi JAVA_HOME agar mengarah ke instalasi JRE, menyembunyikan kesalahan khusus ini dan menyebabkan masalah di kemudian hari. Sementara tujuan utama JRE adalah untuk menjalankan kode Java, JDK juga dapat mengkompilasi dan men - debug di antara perbedaan penting lainnya.

Karena alasan ini, perintah kompilasi mvn akan gagal - seperti yang akan kita lihat di subbagian berikutnya.

3.1. Kegagalan Kompilasi Karena JRE Bukan JDK

Seperti biasa dengan pengaturan default, mereka sangat membantu jika kita memiliki konfigurasi "standar".

Misalnya, jika kita menginstal Java 11 pada sistem Ubuntu 18.04 dan tidak mengatur variabel lingkungan JAVA_HOME , Maven akan dengan senang hati menemukan JDK kita dan menggunakannya untuk tujuan yang berbeda, termasuk kompilasi.

Tetapi jika kita telah berhasil mengatur konfigurasi non-standar (apalagi membuat berantakan) pada sistem kita, bantuan Maven tidak cukup lagi. Bahkan bisa menyesatkan.

Mari kita asumsikan kita memiliki konfigurasi berikut di Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME diatur ke jalur instalasi JRE 8

Jika kami melakukan pemeriksaan dasar kami:

mvn --version

Kami akan mendapatkan hasil yang berarti seperti ini:

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z) Maven home: /opt/apache-maven-3.6.0 Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en, platform encoding: UTF-8 OS name: "linux", version: "4.15.0-42-generic", arch: "amd64", family: "unix"

Mari kita lihat apa yang terjadi jika kita mencoba mengompilasi sebuah proyek:

mvn clean compile

Sekarang, kami mendapatkan kesalahan:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project my-app: Compilation failure [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

3.2. Memperbaiki Kesalahan Kompilasi pada Tingkat Proyek

Seperti dalam banyak kasus lain dengan Maven, disarankan untuk menyiapkan pengaturan seluruh sistem yang berarti - dalam kasus ini, kami akan mengubah nilai variabel JAVA_HOME seperti yang dijelaskan di bagian 5 agar mengarah ke JDK dan bukan JRE.

Namun, jika kami tidak dapat menyetel default karena alasan apa pun, kami masih dapat mengganti setelan di tingkat proyek. Mari kita lihat bagaimana melakukan itu.

Pertama, kita akan membuka pom.xml proyek kita, pergi ke bagian build / pluginManagement / plugins dan lihat entri untuk maven-compiler-plugin :

 maven-compiler-plugin 3.7.0 

Kemudian, kami akan menambahkan konfigurasi ke dalamnya sehingga ia menggunakan eksekusi khusus dan melewati pencarian javac di direktori JAVA_HOME / bin :

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

Pada sistem Unix, eksekusi ini harus berupa skrip dengan izin yang memadai. Pada sistem Windows, ini harus berupa file .exe .

Selanjutnya, kami akan mencoba mengompilasi proyek lagi:

mvn clean compile

Sekarang, build - termasuk fase kompilasi dengan maven-compiler-plugin - berhasil.

4. Memeriksa Konfigurasi JAVA_HOME

Sangat mudah untuk memeriksa apakah JAVA_HOME mengarah ke JDK yang sebenarnya. Kita bisa mencetak isinya di terminal, atau kita bisa menjalankan salah satu perintah shell berikut:

4.1. Checking JAVA_HOME on Linux

Just open a terminal and type:

> $JAVA_HOME/bin/javac -version

If JAVA_HOME points to a JDK, the output should look like:

> javac 1.X.0_XX

If JAVA_HOME doesn't point to a JDK, the OS will throw an error message:

> bash: /bin/javac: No such file or directory

4.2. Checking JAVA_HOME on Windows

Open a command prompt and type:

%JAVA_HOME%\bin\javac -version

If JAVA_HOME points to a JDK, the output should look like:

> javac 1.X.0_XX

If JAVA_HOME doesn't point to a JDK, the OS will throw an error message:

> The system cannot find the path specified.

5. How to Solve the Issue

First of all, we need to know where to find our JDK:

  • If we installed our JDK distribution using a package installer, we should be able to find the path using the OS search utility
  • If the distribution was a portable one, let's check the folder where we extracted it

Setelah kami mengetahui jalur ke JDK, kami dapat menyetel variabel lingkungan JAVA_HOME kami , menggunakan hasil yang sesuai untuk OS khusus kami.

6. Kesimpulan

Dalam tutorial singkat ini, kita telah membahas β€œ JAVA_HOME harus mengarah ke kesalahan Maven JDK bukan JRE” dan memeriksa akar penyebabnya.

Terakhir, kita membahas cara memeriksa variabel lingkungan JAVA_HOME Anda , dan cara memastikannya mengarah ke JDK.