私は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/
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
バージョンがあることです(Sudo
はPATH
を変更します)。 type Java
の発言を確認してください—おそらく、いくつかの異なるJava ldd /path/to/bin/Java
がlibjli.so => not found
を報告するバージョンです。
そして、このJavaバージョンがlibjli.so
を見つけられない理由は、それがrpath(実行可能ファイルに格納されているライブラリ検索パス)を介してそれを探しているためだと推測しますインストールされている方法と一致します。/some/where/bin/Java
にJava
バイナリがあり、相対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
いいね。
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
にシンボリックリンクしました。
バグの原因が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を想定しています。
そのファイルの権限を確認してください。 0644/-rw-r--r--
のようになります。そうでない場合は、再インストールしてくださいopenjdk-6-jre-headless
これは、誰かが権限を乱用したことを意味します。
何らかの奇妙な理由により、/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
同じエラーが発生しました。
それを解決する最も簡単な方法は、jdksとjresをすべて削除し、実行可能ファイル/ usr/bin/Javaがある場合はそれを削除することです。
そして、jdkを再インストールします。
それは私のために問題を解決しました。他の方法はしませんでしたが。
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"
問題が修正されるまで...
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を使用しています。