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는 실제로 내 자바 명령입니다.
$ 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 에서 라이브러리를 찾습니다 . 여기의 경로는 $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
이전에 다른 버전 이 있다는 것입니다 PATH
(을 sudo
변경하십시오 PATH
). 내용을 확인하십시오 . 보고서 type java
와 다른 Java 버전 일 수 있습니다.ldd /path/to/bin/java
libjli.so => not found
그리고이 Java 버전을 찾을 수없는 이유 libjli.so
는 설치 방법과 일치하지 않는 rpath (실행 파일에 저장된 라이브러리 검색 경로)를 통해 찾고 있기 때문입니다. 에 java
바이너리 /some/where/bin/java
가 있고 상대 경로 (Sun JDK 및 OpenJDK의 방식)가있는 경우 라이브러리가 있어야합니다 /some/where/lib/i386/jli/libjli.so
(i386 아키텍처 가정). rpath가 절대적이면 libjli.so
정확한 위치를 지정하거나 LD_LIBRARY_PATH
where를 포함하도록 설정 해야합니다 libjli.so
.
답변
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
좋다
답변
동일한 경로에서 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 와 함께 작동시키는 방법
이 질문에 대해 자세히 대답합니다.
추신. 우리 프로젝트에서 우리는
sudo setcap cap_net_bind_service=+ep /path/to/java
Java 바이너리가 1024 미만의 tcp / udp 포트를 열 수있게합니다. 위의 “bug”위의 7157699는 libjli.so가 /etc/ld.so.conf.d 경로의 conf 파일에있는 디렉토리를 추가하여 빠른 솔루션을 제공합니다. 라이브러리를 다시 캐시하기 위해 ldconfig 호출 리눅스를 가정.
답변
해당 파일에 대한 권한을 확인하십시오. 그들은 다음과 같아야 0644/-rw-r--r--
합니다. 그렇지 않은 경우 openjdk-6-jre-headless
누군가 권한을 엉망으로 만들었 기 때문에를 다시 설치 하십시오.
답변
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 # export LD_LIBRARY_PATH = / usr / lib / jvm / java-6-sun / jre / lib / amd64 / jli : $ LD_LIBRARY_PATH
참고로, 빌드 환경은 Ubuntu 10.04 / 64-bit에서 github : flexiondotorg / oab-java6을 사용합니다.
답변
이상한 이유로 /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
새로운 심볼릭 링크를 만드는 것입니다.
$ sudo rm -rf /usr/bin/java
$ sudo ln -s /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java /usr/bin/java