डेबियन में जावा लॉन्च करने की समस्या: "साझा पुस्तकालयों को लोड करते समय त्रुटि: 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)

युपीडी:

/ usr / lib / jvm / java-6-openjdk / jre / bin / 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:

मैंने रूट पेट को सेट करने की भी कोशिश की है:

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

जड़ के नीचे। लेकिन जावा के लिए कोई उपयोगी पर्यावरण चर नहीं है।

UPD4:

strace -f java -versionपरिणाम: http://dumpz.org/67368/


कृपया strace -f java -versionआउटपुट को चलाएं और पोस्ट करें।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


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

आपके द्वारा चलाए जा रहे निष्पादन योग्य सामान्य लाइब्रेरी खोज पथ के अतिरिक्त एक rathath में पुस्तकालयों के लिए दिखता है। Rpath यहाँ है $ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli। आम तौर पर $ORIGINनिष्पादन योग्य के स्थान से प्रतिस्थापित किया जाना चाहिए, यहां /usr/lib/jvm/java-6-openjdk/jre/bin

यहाँ, $ORIGINप्रतिस्थापित नहीं किया जा रहा है। अतिरिक्त विशेषाधिकारों (सेतु, सेटगिड, या सेटपैक) के साथ चलने वाले निष्पादनयोग्य में यह सुविधा बंद कर दी गई है, क्योंकि अन्यथा आप एक अलग पुस्तकालय को इंजेक्ट कर सकते हैं और इसलिए उन्नत विशेषाधिकारों के साथ मनमाना कोड चला सकते हैं। ( अधिक विस्तृत विवरण के लिए इस लेख को देखें ।) सुरक्षा मुद्दा अपेक्षाकृत हाल ही में खोजा गया था; डेबियन में यह DSA-2122-1 में तय किया गया था , इसलिए इससे पहले कि आप अपग्रेड करते libc6-2.7-18lenny6, आपके javaनिष्पादन योग्य संभवत: काम कर चुके होते।

लक्षण इंगित करता है कि javaअतिरिक्त विशेषाधिकार के साथ चल रहा है। सामान्य डेबियन स्थापना में ऐसा नहीं है। सुनिश्चित करें कि /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कहता है - यह शायद कुछ अलग जावा संस्करण है जिसके लिए ldd /path/to/bin/javaरिपोर्ट libjli.so => not found

और मैं अनुमान लगाता हूं कि यह जावा संस्करण जिस कारण से नहीं मिल रहा libjli.soहै, वह यह है कि यह इसके लिए एक rpath (निष्पादन योग्य में संग्रहीत लाइब्रेरी खोज पथ) के माध्यम से खोज रहा है, जो इसके इंस्टॉल किए गए तरीके से मेल नहीं खाता है। यदि आपके पास javaद्विआधारी है /some/where/bin/java, और इसमें एक रिश्तेदार rpath (जो कि सूर्य जेडडीके और ओपनजेडकेके का तरीका है), पुस्तकालय में होना चाहिए /some/where/lib/i386/jli/libjli.so(एक i386 वास्तुकला मानकर)। यदि rpath निरपेक्ष है, तो आपको या तो libjli.soसटीक निर्दिष्ट स्थान पर रखने की आवश्यकता है, या LD_LIBRARY_PATHजहां शामिल करने के लिए सेट libjli.soहै।


मैं मूल रूप से अपडेट किया गया - ldd / path / to / bin / java वास्तव में हैtype java
aetaur

मैं रूट पथ सेट करने के लिए कोशिश कर रहा हूँ और export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/, लेकिन एक ही त्रुटि मिली।
अनतौर

ठीक है, मैं अपनी शर्त हार गया। ऐसा लगता है कि आपके जावा निष्पादन योग्य अतिरिक्त विशेषाधिकार हैं, जो विषम है।
गिल्स एसओ- बुराई को रोकना '

4

मैंने java.com से .tar.gzप्रारूप में "1.7.0_60" डाउनलोड किया और इसे स्थापित किया /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

के रूप में एक ही रास्ते के अंदर जावा निष्पादन योग्य खोजने की कोशिश करें 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

यदि बग जावा एक्ज़ीक्यूटेबल पर सेट अप का उपयोग करने के कारण है, तो देखें

ओरेकल जावा 7 को कैसे प्राप्त करें सेट किए गए कैप_नेट_बाइंड_ सर्विस + एप और http://bugs.java.com/view_bug.do?bug_id=7157699 के साथ काम करने के लिए

जो इस प्रश्न का विवरण देता है।

ps। हमारे प्रोजेक्ट में हमें करना था

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

जावा बाइनरी को 1024 से नीचे tcp / udp पोर्ट खोलने की अनुमति देने के लिए। ऊपर का जावा "बग" 7157699 डायरेक्टरी जोड़कर त्वरित समाधान प्रदान करता है, जहाँ libjli.so /etc/ld.so.conf.d पथ में एक व्यस्त फ़ाइल में स्थित है और फिर पुस्तकालयों को फिर से कैश करने के लिए कॉलिंग ldconfig। लिनक्स मानते हुए।


0

उस फ़ाइल पर अनुमतियों की जाँच करें। उन्हें जैसा दिखना चाहिए 0644/-rw-r--r--। यदि नहीं, तो पुनः स्थापित करें openjdk-6-jre-headless, क्योंकि इसका मतलब होगा कि किसी ने अनुमतियों के साथ खिलवाड़ किया है।


1
lddlibjli.so => not foundअगर यह .so(कम से कम यही GLibc 2.11 के साथ होता है) नहीं पढ़ सकता है तो रिपोर्ट करेगा ।
गिल्स एसओ- बुराई को रोकना '

0

त्सेपांग के उत्तर के समान, मैंने libjli.soपुस्तकालय खोज पथ में मजबूर किया:

# खोजें / usr / lib / jvm -name \ libjli.so
/usr/lib/jvm/java-6-sun-1.6.0.45/jre/lib/amd64/jli/libjli.so

# निर्यात LD_LIBRARY_PATH = / usr / lib / jvm / java-6-sun / jre / lib / amd64 / jli: $ LD_LIBRARY_PATH


संदर्भ के लिए, मेरा बिल्ड वातावरण github का उपयोग करता है: Ubuntu 10.04 / 64-बिट पर flexiondotorg / oab-java6।


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

तो समाधान में जावा को हटाने /usr/local/binऔर एक नया सिमलिंक बनाने का था:

$ 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

किसी SystemD सेवा से Java अनुप्रयोग शुरू करने और libjli.soलाइब्रेरी से संबंधित त्रुटि प्राप्त करने की कोशिश करने वाले किसी भी व्यक्ति के लिए , पर पढ़ें।

वर्तमान में फेडोरा के लिए इसके लिए एक खुला बग है:

बग 1358476 - SELinux सिस्टमड को निष्पादक जावा आधारित सेवाओं से रोकता है

उस के ऊपर यह है कि 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आपकी सेवा फ़ाइल में जावा प्रक्रिया को लॉन्च करने के लिए उपयोग करना है:

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

जब तक मुद्दा तय नहीं हो जाता ...।


क्या यह होना चाहिए /bin/bash? यदि आप उपयोग करते हैं तो क्या होता है /bin/sh?
जी-मैन '2:15 पर मोनिका'

@ जी-मैन क्या आपने इसे / बिन / श के साथ करने की कोशिश की? मुझे लगता है कि यह भी काम करेगा लेकिन आपको प्रयास करना होगा। कृपया अपडेट करें कि आप इसके साथ कैसे जाते हैं। धन्यवाद
२२:०२ पर comfytoday
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.