Ralat Maven WAR Plugin: Punca ExceptionInInitializerError dan Cara Mengatasinya
بِسْـــــــــمِ ﷲِالرَّحْمَنِ الرَّحِيم. اَللَّهُمَّ صَلِّى عَلَى مُحَمَّدٍٍ، وَعَلَى آلِهِ مُحَمَّدٍٍ
Ralat Maven WAR Plugin: ExceptionInInitializerError — Punca dan Cara Saya Selesaikannya
Baru-baru ini saya terjumpa ralat yang agak mengelirukan semasa membuat build projek Java menggunakan Apache Maven di IntelliJ IDEA. Projek ini menggunakan JDK 8, tapi build tetap gagal. Inilah pengalaman saya mencari punca dan menyelesaikannya.
Ralat Yang Berlaku
Semasa menjalankan perintah Maven package, build berjaya sehingga fasa kompilasi, tapi kemudian gagal pada fasa war dengan mesej ralat seperti ini:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war
(default-war) on project myproject: Execution default-war of goal
org.apache.maven.plugins:maven-war-plugin:2.3:war failed: Unable to load the
mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.3'
due to an API incompatibility...
Dan punca sebenar yang terpapar di bahagian bawah stack trace:
Caused by: java.lang.reflect.InaccessibleObjectException:
Unable to make field private final java.util.Comparator
java.util.TreeMap.comparator accessible:
module java.base does not "opens java.util" to unnamed module
Apa Maksud Ralat Ini?
maven-war-plugin versi 2.3 menggunakan pustaka XStream versi 1.4.3 yang sangat lama (keluaran 2013). Pustaka ini menggunakan kaedah reflection untuk mengakses medan dalaman kelas TreeMap dalam Java.
Masalahnya, sistem modul Java (diperkenalkan dalam Java 9) tidak membenarkan akses sebegini secara lalai. Oleh itu, jika Maven dijalankan menggunakan JDK 9 ke atas, ralat ini akan berlaku walaupun projek anda disasarkan untuk JDK 8.
Tapi Projek Saya Guna JDK 8?
Ya, inilah bahagian yang mengelirukan saya pada mulanya. Projek memang dikompil untuk JDK 8, tapi itu tidak bermakna Maven sendiri berjalan menggunakan JDK 8.
Terdapat perbezaan penting di sini:
- JDK untuk kompilasi projek — ditentukan oleh tetapan
<source>dan<target>dalam pom.xml - JDK untuk menjalankan Maven — ditentukan oleh persekitaran sistem (PATH dan JAVA_HOME)
Maven menggunakan JDK yang dijumpai pertama dalam PATH sistem, bukan semestinya yang ditetapkan dalam JAVA_HOME.
Cara Saya Mengesan Punca Sebenar
Pertama, saya semak versi Java yang digunakan oleh Maven:
D:\_portable_software\apache-maven-3.9.0\bin\mvn --version
Hasilnya:
Apache Maven 3.9.0
Java version: 21.0.11, vendor: Eclipse Adoptium
Java home: C:\Program Files\Eclipse Adoptium\jdk-21.0.11-hotspot
Maven menggunakan JDK 21! Kemudian saya semak JAVA_HOME:
echo %JAVA_HOME%
Hasilnya:
C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx-hotspot\
JAVA_HOME menunjuk ke JDK 8, tapi Maven tetap menggunakan JDK 21. Kenapa?
Punca Sebenar: Susunan PATH
Saya buka tetapan Environment Variables Windows dan lihat senarai PATH. Inilah yang saya jumpa:
C:\Program Files\Eclipse Adoptium\jdk-21.0.11-hotspot\bin← pertama!C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx-hotspot\bin- ... entri-entri lain
JDK 21 berada di kedudukan pertama dalam PATH. Apabila Maven mencari java, ia mengimbas PATH dari atas ke bawah dan menggunakan yang pertama dijumpai — iaitu JDK 21. JAVA_HOME diabaikan sepenuhnya dalam situasi ini.
Penting:JAVA_HOMEsahaja tidak mencukupi. Maven dan kebanyakan alat lain mencarijavamelaluiPATH, bukanJAVA_HOME. Jika kedua-duanya tidak selari, PATH yang menang.
Cara Saya Selesaikannya
Penyelesaiannya mudah — tukar susunan dalam PATH supaya JDK 8 berada di atas JDK 21:
- Buka System Properties → Environment Variables
- Dalam senarai Path, pilih entri JDK 21
- Klik Move Down supaya JDK 8 naik ke kedudukan lebih atas
- Klik OK
- Tutup dan buka semula IntelliJ IDEA (ia perlu restart untuk membaca persekitaran yang baharu)
Selepas itu, saya sahkan semula:
mvn --version
# Java version: 1.8.0_xxx ✓
Build berjaya!
Amalan Terbaik
Daripada menghardcode laluan JDK dalam PATH, lebih baik gunakan %JAVA_HOME%\bin dalam PATH. Dengan cara ini, apabila anda tukar JAVA_HOME, PATH akan ikut secara automatik tanpa perlu edit manual.
Contoh susun atur yang betul dalam PATH:
%JAVA_HOME%\bin← gunakan ini- entri-entri lain...
Kemudian tetapkan JAVA_HOME kepada versi JDK yang anda mahu gunakan. Mudah dan konsisten.
Ringkasan
| Perkara | Butiran |
|---|---|
| Plugin bermasalah | maven-war-plugin 2.3 |
| Punca teknikal | XStream 1.4.3 tidak serasi dengan Java 9+ module system |
| Punca persekitaran | JDK 21 berada lebih atas dalam PATH berbanding JDK 8 |
| Penyelesaian | Alihkan JDK 8 ke kedudukan lebih atas dalam PATH |
| Langkah tambahan | Restart IntelliJ IDEA selepas tukar PATH |
Semoga perkongsian ini membantu sesiapa yang menghadapi masalah yang sama. Ralat sebegini memang susah dikesan pada mulanya kerana ia melibatkan dua lapisan berbeza — versi JDK untuk kod projek, dan versi JDK untuk alat build itu sendiri.
Ralat Maven WAR Plugin: ExceptionInInitializerError — Punca dan Cara Saya Selesaikannya
Baru-baru ini saya terjumpa ralat yang agak mengelirukan semasa membuat build projek Java menggunakan Apache Maven di IntelliJ IDEA. Projek ini menggunakan JDK 8, tapi build tetap gagal. Inilah pengalaman saya mencari punca dan menyelesaikannya.
Ralat Yang Berlaku
Semasa menjalankan perintah Maven package, build berjaya sehingga fasa kompilasi, tapi kemudian gagal pada fasa war dengan mesej ralat seperti ini:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war
(default-war) on project myproject: Execution default-war of goal
org.apache.maven.plugins:maven-war-plugin:2.3:war failed: Unable to load the
mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.3'
due to an API incompatibility...
Dan punca sebenar yang terpapar di bahagian bawah stack trace:
Caused by: java.lang.reflect.InaccessibleObjectException:
Unable to make field private final java.util.Comparator
java.util.TreeMap.comparator accessible:
module java.base does not "opens java.util" to unnamed module
Apa Maksud Ralat Ini?
maven-war-plugin versi 2.3 menggunakan pustaka XStream versi 1.4.3 yang sangat lama (keluaran 2013). Pustaka ini menggunakan kaedah reflection untuk mengakses medan dalaman kelas TreeMap dalam Java.
Masalahnya, sistem modul Java (diperkenalkan dalam Java 9) tidak membenarkan akses sebegini secara lalai. Oleh itu, jika Maven dijalankan menggunakan JDK 9 ke atas, ralat ini akan berlaku walaupun projek anda disasarkan untuk JDK 8.
Tapi Projek Saya Guna JDK 8?
Ya, inilah bahagian yang mengelirukan saya pada mulanya. Projek memang dikompil untuk JDK 8, tapi itu tidak bermakna Maven sendiri berjalan menggunakan JDK 8.
Terdapat perbezaan penting di sini:
- JDK untuk kompilasi projek — ditentukan oleh tetapan
<source>dan<target>dalam pom.xml - JDK untuk menjalankan Maven — ditentukan oleh persekitaran sistem (PATH dan JAVA_HOME)
Maven menggunakan JDK yang dijumpai pertama dalam PATH sistem, bukan semestinya yang ditetapkan dalam JAVA_HOME.
Cara Saya Mengesan Punca Sebenar
Pertama, saya semak versi Java yang digunakan oleh Maven:
D:\_portable_software\apache-maven-3.9.0\bin\mvn --version
Hasilnya:
Apache Maven 3.9.0
Java version: 21.0.11, vendor: Eclipse Adoptium
Java home: C:\Program Files\Eclipse Adoptium\jdk-21.0.11-hotspot
Maven menggunakan JDK 21! Kemudian saya semak JAVA_HOME:
echo %JAVA_HOME%
Hasilnya:
C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx-hotspot\
JAVA_HOME menunjuk ke JDK 8, tapi Maven tetap menggunakan JDK 21. Kenapa?
Punca Sebenar: Susunan PATH
Saya buka tetapan Environment Variables Windows dan lihat senarai PATH. Inilah yang saya jumpa:
C:\Program Files\Eclipse Adoptium\jdk-21.0.11-hotspot\bin← pertama!C:\Program Files\Eclipse Adoptium\jdk-8.0.xxx-hotspot\bin- ... entri-entri lain
JDK 21 berada di kedudukan pertama dalam PATH. Apabila Maven mencari java, ia mengimbas PATH dari atas ke bawah dan menggunakan yang pertama dijumpai — iaitu JDK 21. JAVA_HOME diabaikan sepenuhnya dalam situasi ini.
Penting:JAVA_HOMEsahaja tidak mencukupi. Maven dan kebanyakan alat lain mencarijavamelaluiPATH, bukanJAVA_HOME. Jika kedua-duanya tidak selari, PATH yang menang.
Cara Saya Selesaikannya
Penyelesaiannya mudah — tukar susunan dalam PATH supaya JDK 8 berada di atas JDK 21:
- Buka System Properties → Environment Variables
- Dalam senarai Path, pilih entri JDK 21
- Klik Move Down supaya JDK 8 naik ke kedudukan lebih atas
- Klik OK
- Tutup dan buka semula IntelliJ IDEA (ia perlu restart untuk membaca persekitaran yang baharu)
Selepas itu, saya sahkan semula:
mvn --version
# Java version: 1.8.0_xxx ✓
Build berjaya!
Amalan Terbaik
Daripada menghardcode laluan JDK dalam PATH, lebih baik gunakan %JAVA_HOME%\bin dalam PATH. Dengan cara ini, apabila anda tukar JAVA_HOME, PATH akan ikut secara automatik tanpa perlu edit manual.
Contoh susun atur yang betul dalam PATH:
%JAVA_HOME%\bin← gunakan ini- entri-entri lain...
Kemudian tetapkan JAVA_HOME kepada versi JDK yang anda mahu gunakan. Mudah dan konsisten.
Ringkasan
| Perkara | Butiran |
|---|---|
| Plugin bermasalah | maven-war-plugin 2.3 |
| Punca teknikal | XStream 1.4.3 tidak serasi dengan Java 9+ module system |
| Punca persekitaran | JDK 21 berada lebih atas dalam PATH berbanding JDK 8 |
| Penyelesaian | Alihkan JDK 8 ke kedudukan lebih atas dalam PATH |
| Langkah tambahan | Restart IntelliJ IDEA selepas tukar PATH |
Semoga perkongsian ini membantu sesiapa yang menghadapi masalah yang sama. Ralat sebegini memang susah dikesan pada mulanya kerana ia melibatkan dua lapisan berbeza — versi JDK untuk kod projek, dan versi JDK untuk alat build itu sendiri.
~20260624~
jika kiriman ini bermanfaat, tolong lawat iklan yang ada ya, terima kasih
Ulasan