Masalahnya
“java -version” berhenti dengan pesan kesalahan “kesalahan saat memuat pustaka bersama:libjli.so:tidak dapat membuka file objek bersama:Tidak ada file atau direktori seperti itu” ketika mencoba memulai JVM.
Kasus 1
Masalahnya ada jika dijalankan di bawah pengguna biasa atau jika dijalankan di bawah pengguna root
$ java -version [PATH_TO]/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Kasus 2
Masalahnya hanya ada jika dijalankan oleh pengguna biasa. Tidak ada masalah jika dijalankan di bawah pengguna root.
Di bawah pengguna biasa:
$ java -version [JAVA_HOME]/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Di bawah root:
# [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Solusi untuk Kasus 1
Hanya biner Java yang disalin ke folder (mis. /usr/bin/) tanpa menyalin sisa direktori JRE atau JDK atau hanya hardlink biner Java yang dibuat di folder (mis. /usr/bin/) .
# cp [JAVA_HOME]/jre/bin/java /usr/bin/
Jika biner peluncur Java tidak dapat menemukan file JRE/JDK, itu akan gagal untuk memulai JVM. libjli.so secara dinamis terhubung ke biner Java. Ini adalah salah satu perpustakaan pertama yang coba dimuat oleh peluncur Java. Peluncur Java diperlukan untuk dapat membaca semua pustaka terkait Java agar dapat memulai dengan benar.
Ada 2 cara untuk mengatasinya:
Solusi 1
Buat tautan simbolis sebagai ganti hardlink atau salinan jika Anda ingin memanggil Java dari folder /usr/bin.
# sudo ln -s [path to the JRE's java binary] /usr/bin/javaCatatan :Sistem Linux yang mendukung perintah “update-alternatives” harus menggunakan solusi 2 di bawah ini daripada membuat symlink.
Solusi 2
gunakan perintah update-alternatives sesuai posting di bawah ini untuk mengatur jalur java yang benar.
Perintah "java" tidak menjalankan JVM yang telah diinstalSolusi untuk Kasus 2
Ada 2 skenario di sini:
Skenario 1
“setcap Perintah ” telah digunakan untuk memberikan biner Java izin yang tepat untuk memungkinkan hak khusus pengguna yang tidak memiliki hak istimewa. Misalnya, untuk membuka port yang lebih rendah dari 1024:
# setcap cap_net_bind_service=+ep/bin/java
Saat meningkatkan hak istimewa dari executable, runtime loader (rtld), lebih dikenal sebagai ld.so, tidak akan menautkan dengan pustaka di jalur yang tidak tepercaya. Ini adalah cara ld.so(1) dirancang. Jika executable seperti itu perlu dijalankan, maka jalur ke library terkait untuk executable yang ditinggikan harus ditambahkan ke jalur tepercaya ld.so.
Skenario 2
JDK/JRE dipasang di bawah akun pengguna yang berbeda (misalnya root) dan izin baca dunia telah dihapus secara eksplisit baik hanya dari libjli.so atau bahkan seluruh struktur direktori JDK atau JRE. Contoh:
# chmod -R o-r [JAVA_HOME]
Jika pengguna yang memulai Java tidak memiliki izin untuk membaca perpustakaan libjli.so, Java akan gagal. Ini karena libjli.so secara dinamis terhubung ke biner Java. Java harus dapat membaca semua library yang ditautkan secara dinamis agar dapat memulai dengan benar.
Solusi untuk Skenario 1
Ada 2 solusi di sini:
1. Hapus lagi kapabilitas dari biner Java:
# setcap -r [JAVA_HOME]/bin/java
Verifikasi bahwa java -version berfungsi sekarang:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
2. Buat file seperti ini, dengan path ke libjli.so:
$ cat /etc/ld.so.conf.d/java.conf [JAVA_HOME]/jre/lib/amd64/jliCatatan :Jika Anda menggunakan JRE 32-bit, ganti amd64 dengan i386.
Ini akan menambahkan jalur itu ke jalur pengguna tepercaya yang akan digunakan ld.so. Mungkin diperlukan untuk membangun cache runtime. Verifikasi apakah ld.so melihatnya dengan melakukan hal berikut. Perintah harus dijalankan sebagai root. Reboot mungkin diperlukan.
# ldconfig | grep libjli libjli.so -> libjli.so .......
Verifikasi bahwa java -version berfungsi sekarang:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Solusi untuk Skenario 2
Pulihkan izin baca sehingga libjli.so dan file lain dari direktori JDK/JRE dapat dibaca oleh pengguna. Misalnya:
# chmod -R o+r [JAVA_HOME]
Verifikasi bahwa java -version berfungsi sekarang:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)