Ich versuche Java zu starten:
$ 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
Aber Java funktioniert unter 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 ist eigentlich mein Java-Befehl:
$ 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:
Ich habe auch versucht, root PATH zu setzen:
$ 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:
Ich bin müde:
# comm -3 <(declare | sort) <(declare -f | sort)
unter root. Es gibt jedoch keine verwendbaren Umgebungsvariablen für Java.
UPD4:
strace -f java -version
Ergebnis: http://dumpz.org/67368/
debian
permissions
java
dynamic-linking
Aetaur
quelle
quelle
strace -f java -version
und poste die Ausgabe.Antworten:
Die ausführbare Datei, die Sie ausführen, sucht zusätzlich zum normalen Bibliothekssuchpfad in einem Pfad nach Bibliotheken. Der Weg hierher ist
$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli
. Normalerweise$ORIGIN
sollte hier der Ort der ausführbaren Datei ersetzt werden/usr/lib/jvm/java-6-openjdk/jre/bin
.Hier
$ORIGIN
wird nicht ersetzt. Die Funktion ist in ausführbaren Dateien deaktiviert, die mit zusätzlichen Berechtigungen (setuid, setgid oder setpcap) ausgeführt werden, da Sie sonst möglicherweise eine andere Bibliothek einbinden und beliebigen Code mit erhöhten Berechtigungen ausführen können. (Weitere Informationen finden Sie in diesem Artikel .) Das Sicherheitsproblem wurde vor relativ kurzer Zeit entdeckt. in Debian wurde es in DSA-2122-1 behoben , so dasslibc6-2.7-18lenny6
Ihrejava
ausführbare Datei vermutlich funktioniert hätte , bevor Sie auf aktualisiert haben.Das Symptom zeigt an, dass
java
mit zusätzlichen Berechtigungen ausgeführt wird. Dies ist in einer normalen Debian-Installation nicht der Fall. Stellen Sie sicher, dass/usr/lib/jvm/java-6-openjdk/jre/bin/java
es sich um den Modus 755 handelt und keine Funktionen aufweist (getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
undsetcap -r …
entfernen Sie die Funktionen, falls vorhanden).(Ursprüngliche Antwort, die nützlich sein kann, wenn Sie feststellen, dass diese
java
als root, aber nicht als anderer Benutzer funktioniert, und es sich herausstellt, dass Sie verschiedene Binärdateien aufrufen.)Meine Wette ist, dass Sie eine andere
java
Version früher auf Ihrem habenPATH
(sudo
ändert diePATH
). Überprüfen Sie, wastype java
sagt - es ist wahrscheinlich eine andere Java-Version für welcheldd /path/to/bin/java
Berichtelibjli.so => not found
.Und ich spekuliere, dass der Grund, warum diese Java-Version nicht gefunden werden kann, darin
libjli.so
besteht, dass sie über einen Pfad (Bibliothekssuchpfad, der in der ausführbaren Datei gespeichert ist) sucht, der nicht der Art und Weise entspricht, in der sie installiert ist. Wenn Sie diejava
Binärdatei/some/where/bin/java
eingegeben haben und sie einen relativen Pfad hat (dies ist der Weg von Sun JDK und OpenJDK), sollte sich die Bibliothek in befinden/some/where/lib/i386/jli/libjli.so
(unter der Annahme einer i386-Architektur). Wenn der Pfad absolut ist, müssen Sie entwederlibjli.so
den genau angegebenen Speicherort eingeben oder festlegenLD_LIBRARY_PATH
, wolibjli.so
sich der Pfad befindet.quelle
type java
export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/
, habe aber den gleichen Fehler erhalten.Ich habe "1.7.0_60" von java.com im
.tar.gz
Format heruntergeladen und in installiert/usr/local/jre1.7.0_60
. Ich habe dann einen festen Link zu erstellt/usr/local/bin/java
und den oben beschriebenen Fehler erhalten.Durch Ändern des Hardlinks in einen symbolischen Link wurde das Problem behoben.
Kurzfassung:
Ist schlecht.
Ist gut.
quelle
Versuchen Sie, die ausführbare Java-Datei im selben Pfad wie zu finden,
libjli.so
und verwenden Sie diesen.Zum Beispiel fand ich
libjli.so
in/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so
, so habe ichund fand die ausführbare Datei in
/usr/lib/jvm/java-7-oracle/bin/java
. Dann gelöscht, ichjava
aus/usr/bin
und gerade über ausführbare in Symlink/usr/bin
.quelle
Wenn der Fehler auf die Verwendung von setcap für die ausführbare Java-Datei zurückzuführen ist, lesen Sie
So funktioniert Oracle Java 7 mit setcap cap_net_bind_service + ep und http://bugs.java.com/view_bug.do?bug_id=7157699
was diese Frage im Detail beantwortet.
ps. In unserem Projekt mussten wir tun
Über Java "Bug" 7157699 bietet eine schnelle Lösung, indem das Verzeichnis, in dem sich libjli.so befindet, in eine conf-Datei in /etc/ld.so.conf.d Pfad und dann hinzugefügt wird Aufrufen von ldconfig zum erneuten Zwischenspeichern von Bibliotheken. Angenommen, Linux.
quelle
Überprüfen Sie die Berechtigungen für diese Datei. Sie sollten so aussehen
0644/-rw-r--r--
. Wenn nicht, installieren Sie es erneutopenjdk-6-jre-headless
, da dies bedeuten würde, dass jemand mit den Berechtigungen in Unordnung geraten ist.quelle
ldd
würde melden,libjli.so => not found
wenn es das nicht lesen könnte.so
(zumindest passiert das mit GLibc 2.11).Ähnlich wie Tshepangs Antwort habe ich mich
libjli.so
in den Bibliothekssuchpfad gezwungen :Als Referenz verwendet meine Build-Umgebung github: flexiondotorg / oab-java6 unter Ubuntu 10.04 / 64-bit.
quelle
Aus irgendeinem Grund
/usr/bin/java
wurde nicht mehr auf die Java-Installation hingewiesen. Keine Ahnung wie das passiert ist. Ich bestätigte dies durch Ausführen von:Welches gab mir die folgenden
Die Lösung bestand also darin, das Java-In zu entfernen
/usr/local/bin
und einen neuen Symlink zu erstellen:quelle
Ich hatte den gleichen fehler
Der einfachste Weg, dies zu lösen, besteht darin, einfach alle jdks und jres sowie die ausführbare Datei / usr / bin / java zu entfernen, falls vorhanden.
Und dann jdk neu installieren.
Es hat das Problem für mich gelöst. Während andere Methoden dies nicht taten.
quelle
Für alle, die versuchen, eine Java-Anwendung von einem systemd-Dienst aus zu starten und denselben Fehler im Zusammenhang mit dem zu erhalten
libjli.so
Lesen Bibliothek erhalten möchten.Es gibt derzeit einen offenen Fehler für Fedora:
Bug 1358476 - SELinux verhindert, dass systemd Java-basierte Dienste ausführt
Fazit ist, dass SELinux leise ist den Zugriff auf diese Bibliothek einschränkt. Da es keine AVC-Ablehnungsnachricht gibt, können Sie sie nicht mit dem Kontext oder einer Richtlinienänderung beheben.
Ich habe festgestellt, dass das Hinzufügen einer Datei
/etc/ld.so.conf.d/
, die den Ordner Ihrerlibjli.so
Datei enthält, eine Problemumgehung darstellt:Und dann renn
Aber das ist ziemlich chaotisch ...
Eine bessere Möglichkeit besteht darin
/bin/bash -c
, den Java-Prozess in Ihrer Servicedatei zu starten:Bis das Problem behoben ist ....
quelle
/bin/bash
? Was passiert, wenn Sie verwenden/bin/sh
?