web-dev-qa-db-ja.com

起動時の問題Java Debianの場合:「共有ライブラリのロード中にエラーが発生しました:libjli.so」

私は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はルートの下で動作します:

$ 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は実際にはmy 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/

16
aetaur
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としては機能するが他のユーザーとしては機能しないことが判明した場合に役立つ可能性があり、異なるバイナリを呼び出していることがわかります。)

私の賭けは、あなたのJavaに以前に他のPATHバージョンがあることです(SudoPATHを変更します)。 type Javaの発言を確認してください—おそらく、いくつかの異なるJava ldd /path/to/bin/Javalibjli.so => not foundを報告するバージョンです。

そして、このJavaバージョンがlibjli.soを見つけられない理由は、それがrpath(実行可能ファイルに格納されているライブラリ検索パス)を介してそれを探しているためだと推測しますインストールされている方法と一致します。/some/where/bin/JavaJavaバイナリがあり、相対rpath(Sun JDKおよびOpenJDKの方法)がある場合、ライブラリは/some/where/lib/i386/jli/libjli.so(i386アーキテクチャーを想定)。rpathが絶対パスの場合、libjli.soを正確に指定された場所に配置するか、LD_LIBRARY_PATHを設定してlibjli.soの場所を含める必要があります。

「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

いいね。

4

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
demonkoryu

バグの原因が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 "バグ" 7157699は、libjli.soが配置されているディレクトリを追加することで、迅速な解決策を提供します/etc/ld.so.conf.dパスのconfファイルに入力してから、ldconfigを呼び出してライブラリを再キャッシュします。Linuxを想定しています。

2
Tagar

そのファイルの権限を確認してください。 0644/-rw-r--r--のようになります。そうでない場合は、再インストールしてくださいopenjdk-6-jre-headlessこれは、誰かが権限を乱用したことを意味します。

0
tshepang

何らかの奇妙な理由により、/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

したがって、解決策は/usr/local/binのJavaを削除し、新しいシンボリックリンクを作成することでした。

$ Sudo rm -rf /usr/bin/Java
$ Sudo ln -s /usr/lib/jvm/Java-6-openjdk-AMD64/jre/bin/Java /usr/bin/Java
0
Daithí

同じエラーが発生しました。

それを解決する最も簡単な方法は、jdksとjresをすべて削除し、実行可能ファイル/ usr/bin/Javaがある場合はそれを削除することです。

そして、jdkを再インストールします。

それは私のために問題を解決しました。他の方法はしませんでしたが。

0
Daniyal Yasin

SystemdサービスからJavaアプリケーションを起動しようとすると、libjli.soライブラリに関連する同じエラーが発生する場合があります。

現在、Fedoraには未解決のバグがあります。

バグ1358476 – SELinuxはsystemdがJavaベースのサービスを実行できないようにする

その結果、SELinuxはそのライブラリへのアクセスをサイレントに制限しています。 AVC拒否メッセージはないため、コンテキストやポリシーの変更では修正できません。

/etc/ld.so.conf.d/ファイルのフォルダを含むファイルlibjli.soを追加することが、1つの回避策であることがわかりました。

/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"

問題が修正されるまで...

0
comfytoday

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 


参考までに、私のビルド環境ではUbuntu 10.04/64ビットでgithub:flexiondotorg/oab-Java6を使用しています。

0
chronospoon