ปัญหาในการเปิดจาวาที่ Debian:“ เกิดข้อผิดพลาดขณะโหลดไลบรารีที่แชร์: libjli.so”


16

ฉันพยายามที่จะเปิดตัวจาวา:

$ 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

แต่จาวาทำงานภายใต้รูท:

$ 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 เป็นจริงคำสั่ง java ของฉัน:

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

ฉันได้ลองตั้งค่ารูท PATH แล้ว:

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

ฉันพยายามแล้ว:

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

ภายใต้ราก แต่ไม่มีตัวแปรสภาพแวดล้อมที่ใช้งานได้สำหรับ java

UPD4:

strace -f java -versionผลลัพธ์: http://dumpz.org/67368/


โปรดเรียกใช้strace -f java -versionและโพสต์ผลลัพธ์
Gilles 'หยุดความชั่วร้าย'

นี่คือผลลัพธ์ที่ไม่ดี: dumpz.org/67368
aetaur

คำตอบ:


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

ไฟล์เรียกทำงานที่คุณใช้งานอยู่จะค้นหาไลบรารี่ในทางลาดนอกเหนือไปจากพา ธ การค้นหาไลบรารีปกติ RPATH $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jliที่นี่คือ โดยปกติควรถูกแทนที่ด้วยสถานที่ตั้งของปฏิบัติการที่นี่$ORIGIN/usr/lib/jvm/java-6-openjdk/jre/bin

ที่นี่$ORIGINไม่ได้ถูกแทนที่ คุณลักษณะนี้ปิดใช้งานในโปรแกรมเรียกใช้ที่รันด้วยสิทธิ์พิเศษ (setuid, setgid หรือ setpcap) เพราะมิฉะนั้นคุณอาจจะสามารถฉีดไลบรารี่ที่แตกต่างออกไปและรันโค้ดที่มีสิทธิ์สูง (ดูบทความนี้สำหรับคำอธิบายโดยละเอียดเพิ่มเติม) พบปัญหาความปลอดภัยค่อนข้างเร็ว ใน Debian มันได้รับการแก้ไขในDSA-2122-1ดังนั้นก่อนที่คุณจะอัพเกรดเป็นไฟล์ปฏิบัติการlibc6-2.7-18lenny6ของคุณjavaน่าจะใช้ได้

อาการบ่งชี้ว่าjavaกำลังทำงานโดยมีสิทธิ์เพิ่มเติม นี่ไม่ใช่กรณีในการติดตั้ง Debian ปกติ ตรวจสอบให้แน่ใจว่า/usr/lib/jvm/java-6-openjdk/jre/bin/javaเป็นโหมด 755 และไม่มีความสามารถใด ๆ ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/javaและsetcap -r …เพื่อลบความสามารถถ้ามี)


(คำตอบดั้งเดิมซึ่งอาจมีประโยชน์หากคุณพบว่าใช้javaงานได้ดี แต่ไม่เหมือนผู้ใช้รายอื่นและกลับกลายเป็นว่าคุณเรียกใช้ไบนารีที่ต่างกัน)

เดิมพันของฉันคือคุณมีjavaรุ่นอื่นก่อนหน้านี้ในของคุณPATH( sudoเปลี่ยนPATH) ตรวจสอบสิ่งที่type javaบอกว่า - มันอาจจะบาง Java รุ่นที่แตกต่างกันซึ่งรายงานldd /path/to/bin/javalibjli.so => not found

และฉันคาดการณ์ว่าเหตุผลที่รุ่น Java นี้ไม่สามารถหาได้libjli.soคือมันกำลังมองหาผ่านทาง rpath (เส้นทางการค้นหาไลบรารีที่จัดเก็บในแฟ้มปฏิบัติการ) ที่ไม่ตรงกับวิธีการติดตั้ง หากคุณมีjavaไบนารีใน/some/where/bin/javaและมันมีทางลาดสัมพัทธ์ (ซึ่งเป็นวิธีของ Sun JDK และ OpenJDK) ไลบรารีควรอยู่ใน/some/where/lib/i386/jli/libjli.so(สมมติว่าเป็นสถาปัตยกรรม i386) หาก RPATH คือแน่นอนคุณจะต้องใส่อย่างใดอย่างหนึ่งlibjli.soในสถานที่ที่กำหนดที่แน่นอนหรือชุดLD_LIBRARY_PATHที่จะรวมถึงที่libjli.soเป็น


ฉันได้รับการปรับปรุงโพสต์เดิม - ldd / path / to / bin / java เป็นจริงtype java
aetaur

ฉันพยายามตั้งค่า Root PATH และexport LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/ได้รับข้อผิดพลาดเดียวกัน
aetaur

ตกลงฉันเดิมพันของฉันหายไป ดูเหมือนว่าปฏิบัติการจาวาของคุณมีสิทธิ์เพิ่มเติมซึ่งแปลก
Gilles 'หยุดความชั่วร้าย'

4

ฉันดาวน์โหลด "1.7.0_60" จาก java.com ในรูปแบบและติดตั้งมันเข้าไป.tar.gz /usr/local/jre1.7.0_60จากนั้นฉันได้สร้างลิงก์ไปยัง/usr/local/bin/javaและได้รับข้อผิดพลาดที่อธิบายไว้ข้างต้น

การเปลี่ยนฮาร์ดลิงก์เป็นลิงก์สัญลักษณ์ช่วยแก้ไขปัญหา

เวอร์ชั่นสั้น:

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

ไม่ดี.

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

ดี.


2

ลองค้นหา java ที่สามารถใช้งานได้ในพา ธ เดียวกันlibjli.soและใช้สิ่งนั้น

เช่นผมพบว่าlibjli.soใน/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.soดังนั้นฉันใช้

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

และพบไฟล์ที่เรียกใช้งาน/usr/lib/jvm/java-7-oracle/bin/javaได้ จากนั้นฉันก็ลบjavaจาก/usr/binและเพียงแค่เชื่อมโยงข้างต้นที่ปฏิบัติการ/usr/binได้


2

หากข้อผิดพลาดเกิดจากการใช้ setcap บน Java executable ให้อ้างอิง

วิธีรับ Oracle Java 7 ให้ทำงานกับ setcap cap_net_bind_service + ep และ http://bugs.java.com/view_bug.do?bug_id=7157699

ซึ่งตอบคำถามนี้โดยละเอียด

PS ในโครงการของเราเราต้องทำ

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

เพื่ออนุญาตให้ไบนารี Java เปิดพอร์ต tcp / udp ด้านล่าง 1024 ด้านบน java "บั๊ก" 7157699 มีวิธีแก้ปัญหาอย่างรวดเร็วโดยเพิ่มไดเรกทอรีที่ libjli.so ตั้งอยู่ในไฟล์ conf ใน /etc/ld.so.conf.d path แล้ว การเรียก ldconfig เพื่อแคชไลบรารีอีกครั้ง สมมติว่า Linux


0

ตรวจสอบการอนุญาตในไฟล์นั้น 0644/-rw-r--r--พวกเขาควรมีลักษณะดังนี้ ถ้าไม่ติดตั้งใหม่openjdk-6-jre-headlessเพราะมันจะหมายถึงบางคนยุ่งกับสิทธิ์


1
lddจะรายงานlibjli.so => not foundว่าไม่สามารถอ่านได้.so(อย่างน้อยนั่นคือสิ่งที่เกิดขึ้นกับ GLibc 2.11)
Gilles 'หยุดชั่วร้าย'

0

คล้ายกับคำตอบของ Tshepang ฉันถูกบังคับให้libjli.soเข้าสู่เส้นทางการค้นหาห้องสมุด:

# 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


สำหรับการอ้างอิงสภาพแวดล้อมการสร้างของฉันใช้ github: flexiondotorg / oab-java6 บน Ubuntu 10.04 / 64-bit


0

ด้วยเหตุผลแปลก ๆ บางอย่าง/usr/bin/javaก็ไม่ได้ชี้ไปที่การติดตั้งจาวาอีกต่อไป ไม่รู้เลยว่าสิ่งนี้เกิดขึ้นได้อย่างไร ฉันยืนยันสิ่งนี้เมื่อทำงาน:

$ sudo update-alternatives --config java

ซึ่งให้ฉันดังต่อไปนี้

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

ดังนั้นทางออกคือการลบ java ใน/usr/local/binและสร้าง symlink ใหม่:

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

0

ฉันมีข้อผิดพลาดเดียวกัน

วิธีที่ง่ายที่สุดในการแก้ปัญหาคือเพียงลบ jdks และ jres ทั้งหมดและยังสามารถใช้งานได้ / usr / bin / java หากมี

จากนั้นติดตั้ง jdk อีกครั้ง

มันแก้ไขปัญหาให้ฉันได้ ในขณะที่วิธีการอื่นไม่ได้


0

สำหรับทุกคนที่พยายามเริ่มต้นแอ็พพลิเคชัน Java จากเซอร์วิส systemd และรับข้อผิดพลาดเดียวกันที่เกี่ยวข้องกับlibjli.soไลบรารีอ่านต่อ

มีข้อผิดพลาดแบบเปิดสำหรับสิ่งนี้สำหรับ Fedora ในปัจจุบัน:

1358,476 ข้อผิดพลาด - SELinux ป้องกัน systemd จากบริการ Java-based รัน

สิ่งที่เหนือกว่าคือ SELinux กำลังจำกัด การเข้าถึงไลบรารีนั้นอย่างเงียบ ๆ เนื่องจากไม่มีข้อความปฏิเสธ AVC คุณจึงไม่สามารถแก้ไขได้ด้วยบริบทหรือการเปลี่ยนแปลงนโยบาย

ฉันพบว่าการเพิ่มไฟล์/etc/ld.so.conf.d/ที่มีโฟลเดอร์libjli.soไฟล์ของคุณเป็นวิธีแก้ไขปัญหาเดียว:

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

จากนั้นเรียกใช้

ldconfig

แต่มันค่อนข้างยุ่ง ...

ตัวเลือกที่ดีกว่าคือการใช้/bin/bash -cเพื่อเปิดกระบวนการ Java ในไฟล์บริการของคุณ:

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

จนกว่าปัญหาจะได้รับการแก้ไข ....


มันจะต้องเป็น/bin/bashอย่างไร จะเกิดอะไรขึ้นถ้าคุณใช้/bin/sh?
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man คุณลองใช้ด้วย / bin / sh หรือยัง ฉันเดาว่าจะใช้การได้ แต่คุณต้องลอง โปรดอัปเดตด้วยวิธีที่คุณใช้ ขอบคุณ
comfytoday
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.