Saya mencoba meluncurkan java:
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
$ ldd /usr/lib/jvm/java-6-openjdk/jre/bin/java
linux-gate.so.1 => (0xb779f000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7780000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000)
libjli.so => /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
/lib/ld-linux.so.2 (0xb77a0000
$ ls /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/
libjli.so
Tetapi java bekerja di bawah root:
$ sudo java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~lenny1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)
UPD:
/ usr / lib / jvm / java-6-openjdk / jre / bin / java sebenarnya adalah perintah java saya:
$ type java
java is hashed (/usr/bin/java)
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 14 10:15 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Jul 14 10:36 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
UPD2:
Saya juga mencoba mengatur PATH root:
$ sudo su
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
UPD3:
Saya sudah mencoba:
# comm -3 <(declare | sort) <(declare -f | sort)
di bawah root. Tetapi tidak ada variabel lingkungan yang dapat digunakan untuk java.
UPD4:
strace -f java -version
hasil: http://dumpz.org/67368/
debian
permissions
java
dynamic-linking
Aetaur
sumber
sumber
strace -f java -version
dan kirim hasilnya.Jawaban:
Executable Anda menjalankan penampilan untuk perpustakaan di rPath di samping jalur pencarian perpustakaan normal. Permusuhan di sini adalah
$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli
. Biasanya$ORIGIN
harus diganti dengan lokasi yang dapat dieksekusi, di sini/usr/lib/jvm/java-6-openjdk/jre/bin
.Di sini,
$ORIGIN
tidak diganti. Fitur ini dimatikan dalam executable yang berjalan dengan hak istimewa tambahan (setuid, setgid, atau setpcap), karena jika tidak, Anda mungkin dapat menyuntikkan pustaka yang berbeda dan menjalankan kode arbitrer dengan hak istimewa yang ditingkatkan. (Lihat artikel ini untuk penjelasan lebih rinci.) Masalah keamanan ditemukan relatif baru-baru ini; di Debian itu diperbaiki di DSA-2122-1 , jadi sebelum Anda memutakhirkan kelibc6-2.7-18lenny6
,java
executable Anda mungkin akan bekerja.Gejala menunjukkan bahwa
java
ini berjalan dengan hak istimewa tambahan. Ini bukan kasus di instalasi Debian normal. Pastikan itu/usr/lib/jvm/java-6-openjdk/jre/bin/java
adalah mode 755 dan tidak memiliki kapabilitas (getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
, dansetcap -r …
untuk menghapus kapabilitas jika ada).(Jawaban orisinal, yang mungkin berguna jika Anda menemukan bahwa itu
java
berfungsi sebagai root tetapi tidak sebagai pengguna lain, dan ternyata Anda memanggil binari yang berbeda.)Taruhan saya adalah bahwa Anda memiliki beberapa
java
versi lain sebelumnya diPATH
(sudo
mengubahPATH
). Periksa apa yangtype java
dikatakan - itu mungkin beberapa versi Java yang berbeda untukldd /path/to/bin/java
laporan manalibjli.so => not found
.Dan saya berspekulasi bahwa alasan yang tidak dapat ditemukan oleh versi Java ini
libjli.so
adalah bahwa ia mencarinya melalui rpath (jalur pencarian pustaka yang disimpan di executable) yang tidak cocok dengan cara pemasangannya. Jika Anda memilikijava
biner di/some/where/bin/java
dalamnya, dan ia memiliki jalur relatif (yang merupakan jalan dari Sun JDK dan OpenJDK), perpustakaan harus berada dalam/some/where/lib/i386/jli/libjli.so
(dengan asumsi arsitektur i386). Jika rpath absolut, Anda harus memasukkanlibjli.so
lokasi yang ditentukan dengan tepat, atau mengaturLD_LIBRARY_PATH
untuk menyertakan di manalibjli.so
.sumber
type java
export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/
, tetapi mendapat kesalahan yang sama.Saya mengunduh "1.7.0_60" dari java.com dalam
.tar.gz
format dan memasangnya/usr/local/jre1.7.0_60
. Saya kemudian membuat tautan keras ke/usr/local/bin/java
dan menerima kesalahan yang dijelaskan di atas.Mengubah hardlink ke tautan simbolik memperbaiki masalah.
Versi pendek:
Buruk.
Bagus
sumber
Cobalah untuk menemukan executable java di dalam jalur yang sama
libjli.so
dan gunakan itu.Misalnya saya temukan
libjli.so
di/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so
, jadi saya gunakandan menemukan executable di
/usr/lib/jvm/java-7-oracle/bin/java
. Kemudian, saya dihapusjava
dari/usr/bin
dan hanya symlinked atas ke executable/usr/bin
.sumber
Jika bug disebabkan oleh penggunaan setcap pada Java yang dapat dieksekusi, maka lihat
Cara mendapatkan Oracle Java 7 agar berfungsi dengan setcap cap_net_bind_service + ep dan http://bugs.java.com/view_bug.do?bug_id=7157699
yang menjawab pertanyaan ini secara terperinci.
ps. Dalam proyek kami, kami harus melakukannya
untuk mengizinkan java binary untuk membuka port tcp / udp di bawah 1024. Di atas java "bug" 7157699 menyediakan solusi cepat, dengan menambahkan direktori di mana libjli.so berada dalam file conf di path /etc/ld.so.conf.d lalu memanggil ldconfig untuk me-cache kembali perpustakaan. Dengan asumsi Linux.
sumber
Periksa izin pada file itu. Mereka seharusnya terlihat seperti
0644/-rw-r--r--
. Jika tidak, instal ulangopenjdk-6-jre-headless
, karena itu berarti seseorang mengacaukan izin.sumber
ldd
akan melaporkanlibjli.so => not found
jika tidak dapat membaca.so
(setidaknya itulah yang terjadi dengan GLibc 2.11).Mirip dengan jawaban Tshepang, saya dipaksa
libjli.so
masuk ke jalur pencarian perpustakaan:Sebagai referensi, lingkungan build saya menggunakan github: flexiondotorg / oab-java6 di Ubuntu 10.04 / 64-bit.
sumber
Untuk beberapa alasan aneh
/usr/bin/java
tidak lagi menunjuk ke instalasi java. Tidak tahu bagaimana ini terjadi. Saya mengkonfirmasi ini dengan menjalankan:Yang memberi saya yang berikut
Jadi solusinya adalah menghapus java di
/usr/local/bin
dan membuat symlink baru:sumber
Saya memiliki kesalahan yang sama.
Cara termudah untuk menyelesaikannya adalah dengan menghapus semua jdks dan jres dan juga executable / usr / bin / java, jika ada.
Dan kemudian instal ulang jdk.
Itu memecahkan masalah bagi saya. Sementara metode lain tidak.
sumber
Bagi siapa pun yang mencoba memulai aplikasi Java dari layanan systemd dan mendapatkan kesalahan yang sama, terkait dengan
libjli.so
perpustakaan, baca terus.Ada bug terbuka untuk ini untuk Fedora saat ini:
Bug 1358476 - SELinux mencegah systemd dari mengeksekusi layanan berbasis java
Hasilnya adalah SELinux secara diam - diam membatasi akses ke perpustakaan itu. Karena tidak ada pesan yang ditolak AVC, Anda tidak dapat memperbaikinya dengan konteks, atau perubahan kebijakan.
Saya telah menemukan bahwa menambahkan file
/etc/ld.so.conf.d/
yang berisi folderlibjli.so
file Anda adalah satu solusi:Dan kemudian jalankan
Tapi itu cukup berantakan ...
Opsi yang lebih baik adalah menggunakan
/bin/bash -c
untuk meluncurkan proses Java di file layanan Anda:Sampai masalah ini diperbaiki ....
sumber
/bin/bash
? Apa yang terjadi jika Anda menggunakan/bin/sh
?