在Debian上启动Java的问题:“加载共享库时出错:libjli.so”


16

我正在尝试启动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

但是java在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实际上是我的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)

在根下。但是没有适用于Java的环境变量。

UPD4:

strace -f java -version结果:http : //dumpz.org/67368/


请运行strace -f java -version并发布输出。
吉尔(Gilles)'所以

这是strace结果:dumpz.org/67368
aetaur 2011年

Answers:


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

您正在运行的可执行文件除了正常的库搜索路径外,还在rpath中查找库。这里的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以root用户而不是其他用户的身份使用,可能会很有用,事实证明您正在调用不同的二进制文件。)

我敢打赌,您javaPATH(会sudo更改PATH)上有其他版本。检查type java说什么- ldd /path/to/bin/java报告可能是一些不同的Java版本libjli.so => not found

而且我推测找不到此Java版本的原因libjli.so是,它是通过与安装方式不匹配的rpath(存储在可执行文件中的库搜索路径)寻找它的。如果java二进制文件在中/some/where/bin/java,并且二进制文件具有相对的rpath(这是Sun JDK和OpenJDK的方式),则该库应该在其中/some/where/lib/i386/jli/libjli.so(假定为i386体系结构)。如果rpath是绝对路径,则需要将其放置libjli.so在确切的指定位置,或设置LD_LIBRARY_PATH为包括where libjli.so


我最初更新过type java
-ldd

我尝试设置根PATH和export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/,但是遇到了相同的错误。
aetaur 2011年

好吧,我输了。看来您的Java可执行文件还具有其他特权,这很奇怪。
吉尔(Gilles)“所以,别再邪恶了”,

4

我从java.com下载了“ 1.7.0_60” .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

如果错误是由于在Java可执行文件上使用setcap引起的,请参阅

如何使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二进制文件打开低于1024的tcp / udp端口。在Java“ bug”上方7157699提供了快速解决方案,方法是将libjli.so所在的目录添加到/etc/ld.so.conf.d路径中的conf文件中,然后调用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进入图书馆搜索路径:

#找到/ 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


作为参考,我的构建环境在Ubuntu 10.04 / 64位上使用github:flexiondotorg / oab-java6。


0

由于某种奇怪的原因/usr/bin/java,不再指向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并创建一个新的符号链接:

$ 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库相关的相同错误的任何人,请继续阅读。

目前Fedora有一个打开的错误:

错误1358476 – SELinux阻止systemd执行基于Java的服务

结果是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说'Resstate Monica''Mar

@ G-Man您是否使用/ bin / sh尝试了?我想这也可以,但是您必须尝试。请更新您的使用方式。谢谢
comfytoday
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.