GNU/Linux >> Belajar Linux >  >> Linux

"kesalahan saat memuat perpustakaan bersama:libjli.so:tidak dapat membuka file objek bersama:Tidak ada file atau direktori seperti itu" kesalahan 'java -version' pada Startup

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/java
Catatan :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 diinstal

Solusi 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/jli
Catatan :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)


Linux
  1. Cara Mengatasi Kesalahan "tidak dapat membuka file objek bersama" di Distribusi Linux berbasis Ubuntu

  2. Bagaimana cara memperbaiki Kesalahan Instalasi Python saat memuat pustaka bersama:libssl.so.1.0.0? [Terselesaikan]

  3. rpm:kesalahan saat memuat pustaka bersama:header ELF tidak valid

  1. libstdc++.so.5:tidak dapat membuka file objek bersama - tetapi pustaka diinstal dan mutakhir

  2. libpulse.so.0:tidak dapat membuka file objek bersama:Tidak ada file atau direktori tersebut

  3. ImportError:libtk8.6.so:tidak dapat membuka file objek bersama:Tidak ada file atau direktori tersebut

  1. Kesalahan memuat pustaka bersama libcrypto.so.1.1 – OpenSSL [Perbaiki]

  2. komposisi buruh pelabuhan:Kesalahan saat memuat pustaka bersama:libz.so.1:gagal memetakan segmen dari objek bersama:Operasi tidak diizinkan

  3. conda.exe:kesalahan saat memuat pustaka bersama:libz.so.1