JAVA_HOME harus menunjukkan JDK bukan JRE

1. Pengenalan

Dalam tutorial ini, kita akan membincangkan pengecualian yang dilemparkan Maven apabila salah konfigurasi: JAVA_HOME harus menunjukkan JDK, bukan JRE.

Maven adalah alat yang kuat untuk membina kod. Kami akan melihat ke bawah untuk memahami mengapa ralat ini berlaku dan akan melihat bagaimana menyelesaikannya.

2. Masalah JAVA_HOME

Setelah memasang Maven, kita harus menetapkan pemboleh ubah persekitaran JAVA_HOME , sehingga alat itu tahu di mana untuk mencari perintah JDK untuk dilaksanakan. Tujuan Maven menjalankan perintah Java yang sesuai dengan kod sumber projek.

Sebagai contoh, senario yang paling biasa adalah menyusun kod dengan melaksanakan perintah javac .

Sekiranya JAVA_HOME tidak menunjukkan pemasangan JDK yang sah , Maven akan membuang kesalahan pada setiap pelaksanaan:

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 Maven mengesahkan laluan JAVA_HOME ?

Sebelum menjalankan sebarang tujuan, Maven memeriksa keberadaan perintah java di jalan yang ditentukan oleh JAVA_HOME atau dengan meminta OS untuk pemasangan JDK lalai. Sekiranya eksekusi tidak dijumpai, Maven berakhir dengan kesalahan.

Berikut adalah pemeriksaan mvn yang dapat dilaksanakan 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 kelihatan munasabah pada pandangan pertama, tetapi kita harus mempertimbangkan bahawa JDK dan JRE mempunyai folder bin dan kedua-duanya mengandungi fail java yang dapat dilaksanakan .

Oleh itu, mungkin untuk mengkonfigurasi JAVA_HOME untuk menunjuk ke pemasangan JRE, menyembunyikan ralat ini dan menyebabkan masalah pada peringkat kemudian. Walaupun tujuan utama JRE adalah menjalankan kod Java, JDK juga dapat menyusun dan men-debug antara perbezaan penting lainnya.

Atas sebab ini, arahan kompilasi mvn akan gagal - seperti yang akan kita lihat dalam subseksyen seterusnya.

3.1. Kegagalan Penyusunan Kerana JRE Bukan JDK

Seperti biasa dengan tetapan lalai, sangat berguna jika kita mempunyai konfigurasi "standard".

Sebagai contoh, jika kita memasang Java 11 pada sistem Ubuntu 18.04 dan tidak menetapkan pemboleh ubah persekitaran JAVA_HOME , Maven masih dengan senang hati akan menemukan JDK kami dan menggunakannya untuk tujuan yang berbeza, termasuk menyusun.

Tetapi jika kita berjaya mengatur konfigurasi tidak standard (apalagi membuat kekacauan) pada sistem kita, pertolongan Maven tidak mencukupi lagi. Ia bahkan boleh mengelirukan.

Anggaplah kita mempunyai konfigurasi berikut di Ubuntu 18.04:

  • JDK 11
  • JRE 8
  • JAVA_HOME ditetapkan ke jalan pemasangan JRE 8

Sekiranya kami melakukan pemeriksaan asas:

mvn --version

Kami akan mendapat output yang bermakna 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 lihat apa yang berlaku jika kita cuba menyusun projek:

mvn clean compile

Sekarang, kami mendapat ralat:

[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 di Tahap Projek

Seperti dalam banyak kes lain dengan Maven, disarankan untuk menetapkan tetapan seluruh sistem yang bermakna - dalam kes ini, kami akan mengubah nilai pemboleh ubah JAVA_HOME seperti yang dijelaskan di bahagian 5 untuk menunjuk ke JDK dan bukannya JRE.

Namun, jika kita tidak dapat menetapkan lalai dengan alasan apa pun, kita masih boleh mengesampingkan tetapan di tingkat projek. Mari lihat bagaimana melakukannya.

Pertama, kami akan membuka pom.xml projek kami, pergi ke bahagian build / pluginManagement / plugin dan lihat entri untuk maven-compiler-plugin :

 maven-compiler-plugin 3.7.0 

Kemudian, kami akan menambahkan konfigurasi padanya sehingga menggunakan custom executable dan melangkau mencari 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, pelaksanaan ini harus menjadi skrip dengan izin yang mencukupi. Pada sistem Windows, mestilah fail .exe .

Seterusnya, kami akan cuba menyusun semula projek:

mvn clean compile

Kini, build - termasuk fasa kompilasi dengan plugin maven-compiler - berjaya.

4. Memeriksa Konfigurasi JAVA_HOME

Cukup mudah untuk memeriksa sama ada JAVA_HOME menunjukkan JDK sebenar. Kita boleh mencetak kandungannya di terminal, atau kita boleh 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 mengetahui jalan menuju JDK, kami dapat menetapkan pemboleh ubah persekitaran JAVA_HOME kami , menggunakan hasil yang sesuai untuk OS tertentu kami.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami telah membincangkan ralat " JAVA_HOME harus menunjuk ke JDK bukan JRE" Maven dan meneliti akarnya.

Akhirnya, kami membincangkan cara memeriksa pemboleh ubah persekitaran JAVA_HOME anda , dan bagaimana memastikannya menunjuk ke JDK.