Java'yı Debian'da başlatma sorunu: “paylaşılan kütüphaneleri yüklerken hata: libjli.so”


16

Java'yı başlatmaya çalışıyorum:

$ 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

Ancak java kök altında çalışır:

$ 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 aslında benim java komutum:

$ 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:

Ayrıca kök PATH ayarlamaya çalıştım:

$ 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:

Yoruldum:

# comm -3 <(declare | sort) <(declare -f | sort)

kök altında. Ancak java için kullanılabilir ortam değişkenleri yoktur.

UPD4:

strace -f java -versionsonuç: http://dumpz.org/67368/


Lütfen strace -f java -versionçıktıyı çalıştırın ve yayınlayın.
Gilles 'SO- kötü olmayı bırak'

Bu strace sonuçtur: dumpz.org/67368
aetaur

Yanıtlar:


12
open("$ORIGIN/../lib/i386/jli/tls/i686/sse2/cmov/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)

Çalıştırdığınız yürütülebilir dosya , normal kitaplık arama yoluna ek olarak bir rpath içindeki kitaplıkları arar. Buradaki yol $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli. Normalde $ORIGIN, burada yürütülebilir dosyanın konumu ile değiştirilmelidir /usr/lib/jvm/java-6-openjdk/jre/bin.

Burada, $ORIGINdeğiştirilmiyor. Bu özellik, ekstra ayrıcalıklarla (setuid, setgid veya setpcap) çalışan yürütülebilir dosyalarda kapatılır, aksi takdirde farklı bir kitaplık enjekte edebilir ve bu nedenle yükseltilmiş ayrıcalıklarla rastgele kod çalıştırabilirsiniz. ( Daha ayrıntılı bir açıklama için bu makaleye bakın .) Güvenlik sorunu nispeten yakın zamanda keşfedildi; Debian o giderilmiştir DSA-2122-1 Eğer yükseltilmiş böylece önce, libc6-2.7-18lenny6sizin, javayürütülebilir muhtemelen ızgaralarının.

Belirti, javaek ayrıcalıklarla çalıştığını gösterir . Normal bir Debian kurulumunda durum böyle değildir. /usr/lib/jvm/java-6-openjdk/jre/bin/javaMod 755 olduğundan ve herhangi bir özelliğe sahip olmadığından ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/javave setcap -r …varsa yetenekleri kaldırmak için) emin olun.


( javaKök olarak çalıştığını, ancak diğer kullanıcılar gibi çalışmadığını ve farklı ikili dosyaları çağırdığınızı ortaya çıkarırsanız faydalı olabilecek orijinal yanıt .)

Bahse girerim, javadaha önce üzerinde başka bir sürümünüz olması PATH( sudodeğiştirir PATH). Ne type javayazdığını kontrol edin - muhtemelen ldd /path/to/bin/javaraporları için farklı bir Java sürümü libjli.so => not found.

Ve bu Java sürümünün bulamamasının sebebinin, libjli.soyüklü olduğu yolla eşleşmeyen bir rpath (yürütülebilir dosyada depolanan kütüphane arama yolu) aracılığıyla araması olduğunu tahmin ediyorum. Eğer varsa javaiçinde ikili /some/where/bin/javave (Güneş JDK ve OpenJDK yoludur) göreceli bir rpath vardır, kütüphane olmalıdır /some/where/lib/i386/jli/libjli.so(bir i386 mimarisi varsayarak). Rpath mutlaksa, libjli.sotam olarak belirtilen konuma koymanız veya LD_LIBRARY_PATHnereye dahil edeceğinizi ayarlamanız gerekir libjli.so.


aslında sonrası güncellenmiş - ldd / yol / / bin / java aslındatype java
aetaur

Kök PATH ayarlamaya çalıştım export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/ve aynı hatayı aldım.
aetaur

Tamam, bahsimi kaybettim. Java çalıştırıcınızın ek ayrıcalıkları var gibi görünüyor, bu garip.
Gilles 'SO- kötü olmayı bırak'

4

Java.com'dan "1.7.0_60" .tar.gzbiçimini indirip yükledim /usr/local/jre1.7.0_60. Daha sonra sabit bir bağlantı oluşturdum /usr/local/bin/javave yukarıda açıklanan hatayı aldım .

Sabit bağlantıyı sembolik bir bağlantıya değiştirmek sorunu çözdü.

Kısa versiyon:

$ sudo ln /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

Kötüdür.

$ sudo ln -s /usr/local/jre1.7.0_60/bin/java /usr/local/bin/java

İyidir.


2

Java yürütülebilir dosyasını aynı yol içinde bulmaya çalışın libjli.sove bunu kullanın.

Örneğin buldum libjli.soiçinde /usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.sokullandığım bu yüzden,

find /usr/lib/jvm/java-7-oracle/ -name "java"

ve yürütülebilir dosyayı bulundu /usr/lib/jvm/java-7-oracle/bin/java. Sonra sildim javagelen /usr/binve sadece çalıştırılabilir yukarıdaki sembolik olarak /usr/bin.


2

Hata, Java yürütülebilir dosyasında setcap kullanmasından kaynaklanıyorsa, bkz.

Oracle Java 7'nin setcap cap_net_bind_service + ep ve http://bugs.java.com/view_bug.do?bug_id=7157699 ile çalışmasını sağlama

bu soruya ayrıntılı olarak cevap veriyor.

ps. Projemizde yapmak zorundaydık

sudo setcap cap_net_bind_service=+ep /path/to/java

java binary'nin 1024'ün altında tcp / udp portlarını açmasına izin vermek için. java "bug" 7157699, libjli.so dosyasının /etc/ld.so.conf.d yolundaki bir conf dosyasına yerleştirildiği dizini ekleyerek hızlı bir çözüm sağlar. kütüphaneleri yeniden önbelleğe almak için ldconfig çağrılıyor. Linux varsayımı.


0

Bu dosyadaki izinleri kontrol edin. Onlar gibi görünmeli 0644/-rw-r--r--. Değilse, yeniden yükleyin openjdk-6-jre-headless, çünkü birinin izinlerle uğraştığı anlamına gelir.


1
lddrapor verecek libjli.so => not foundo okuyamadı eğer .so(en azından glibc 2.11 ile olan budur).
Gilles 'SO- kötü olmayı bırak'

0

Tshepang'ın cevabına benzer libjli.soşekilde, kütüphane arama yolunu zorladım :

# find / usr / lib / jvm -name \ libjli.so
/usr/lib/jvm/java-6-sun-1.6.0.45/jre/lib/amd64/jli/libjli.so

# export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-sun / jre / lib / amd64 / jli: $ LD_LIBRARY_PATH


Referans olarak, derleme ortamım Ubuntu 10.04 / 64-bit üzerinde github: flexiondotorg / oab-java6 kullanıyor.


0

Bazı tuhaf nedenlerden dolayı /usr/bin/javaartık java kurulumuna işaret etmiyordu. Bunun nasıl olduğu hakkında hiçbir fikrim yok. Bunu çalıştırarak onayladım:

$ sudo update-alternatives --config java

Hangi bana verdi

There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
Nothing to configure.
update-alternatives: warning: forcing reinstallation of alternative /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java because link group java is broken
update-alternatives: warning: not replacing /usr/bin/java with a link

Böylece çözüm, java'yı kaldırmak /usr/local/binve yeni bir sembolik bağlantı oluşturmaktı:

$ sudo rm -rf /usr/bin/java
$ sudo ln -s /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java /usr/bin/java

0

Aynı hatayla karşılaştım.

Bunu çözmenin en basit yolu, tüm jdks'leri ve jres'leri ve ayrıca varsa yürütülebilir / usr / bin / java'yı kaldırmaktır.

Ve sonra jdk'yi yeniden yükleyin.

Sorunu benim için çözdü. Diğer yöntemler yoktu.


0

Systemd hizmetinden bir Java uygulaması başlatmaya ve libjli.sokitaplıkla ilgili aynı hatayı almaya çalışan herkes için okumaya devam edin.

Şu anda Fedora için açık bir hata var:

Hata 1358476 - SELinux, systemd'nin java tabanlı hizmetleri yürütmesini engelliyor

Bunun üstesinden gelmek, SELinux'un kütüphaneye erişimi sessizce kısıtlamasıdır. AVC tarafından reddedilen bir ileti olmadığından, içeriği veya ilke değişikliği ile düzeltemezsiniz.

Dosyanızın /etc/ld.so.conf.d/klasörünü içeren bir dosya eklemenin bir libjli.soçözüm olduğunu gördüm :

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-5.b14.fc26.x86_64/jre/lib/amd64/jli/

Ve sonra koş

ldconfig

Ama bu oldukça dağınık ...

Daha iyi bir seçenek, /bin/bash -chizmet dosyanızda Java işlemini başlatmak için kullanmaktır :

ExecStart=/bin/bash -c "/usr/bin/java -Xmx1024m -jar myApp.jar NONINTERACTIVE"

Sorun düzelinceye kadar ....


Olmak zorunda mı /bin/bash? Kullanırsan ne olur /bin/sh?
G-Man 'Monica'yı Yeniden

@ G-Man / bin / sh ile denediniz mi? Sanırım bu da işe yarayacaktı ama denemek zorunda kalacaksın. Lütfen onunla nasıl gittiğini güncelleyin. Teşekkürler
comfytoday
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.