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)
고쳐 쓰다:
/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)으로 실행되는 실행 파일에서는 꺼집니다. 그렇지 않으면 다른 라이브러리를 삽입하여 상승된 권한으로 임의 코드를 실행할 수 있기 때문입니다. (보다이 기사더 자세한 설명을 원하시면. ) 보안 문제는 최근에야 발견되었으며 데비안에서는 수정되었습니다.DSA-2122-1로 업그레이드하기 전에 실행 libc6-2.7-18lenny6
파일 java
이 작동 중이었을 수 있습니다 .
이 증상은 java
추가 권한으로 실행 중임을 나타냅니다. 일반적인 데비안 설치에서는 이런 일이 발생하지 않습니다. /usr/lib/jvm/java-6-openjdk/jre/bin/java
모드가 755이고 기능이 없는지 확인하십시오 ( getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
및 setcap -r …
기능이 있는 경우 제거).
java
(원래 답변, 이는 루트로 작동하지만 다른 사용자로는 작동하지 않고 다른 바이너리를 호출하는 경우 유용할 수 있습니다.)
귀하의 (변경) 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
, 누군가가 권한을 엉망으로 만들었다는 의미이기 때문입니다.