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)
修正する:
/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
アップデート2:
また、ルートパスを設定しようとしました。
$ 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
アップデート3:
私は試した:
# comm -3 <(declare | sort) <(declare -f | sort)
根の下。ただし、Javaには使用可能な環境変数はありません。
UPD4:
strace -f java -version
結果:http://dumpz.org/67368/
答え1
open("$ORIGIN/../lib/i386/jli/tls/i686/sse2/cmov/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
実行中の実行可能ファイルは、次の場所でライブラリを探します。道汎用ライブラリの検索パスに追加されます。ここで、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
以前に別のバージョンがあったでしょう。内容を確認してください。報告されたJavaバージョンが異なる場合があります。PATH
sudo
PATH
type java
ldd /path/to/bin/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
場所を含めるように設定する必要がありますlibjli.so
。
答え2
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
とても良いです。
答え3
同じパスで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
。
答え4
ファイルの権限を確認してください。彼らは次のようになります0644/-rw-r--r--
。そうでない場合は、再インストールしてください。openjdk-6-jre-headless
、誰かが権限を混乱させたという意味だからです。