2017-04-07 4 views
1

여기 내 문제가 있습니다. 내 Webapp 및 .jar에 의존하는 WEB-INF/lib에 .jar가 있습니다. 따라서 Tomcat이 실행중인 호스트에 파일이 존재해야합니다. 응용 프로그램 관리자를 통해 WAR 파일을 배포 할 때 JNI 래퍼 클래스가 .jar에서로드 될 때 시작 로그에 UnsatisfiedLinkError: file not found이 표시됩니다. 링크 된 라이브러리가있는 디렉토리를 보면 분명히 존재하며 전 세계 읽기 및 실행 권한을 가지고 있으며 소유자를 Tomcat을 실행하는 동일한 실행 사용자로 변경했습니다. 명령 줄에서 WAR 파일을 실행할 수 있고 오류가 발생하지 않기 때문에 이것이 사용 권한 문제인지 확실히 알 수 있습니다. 나는 누군가가 내가 놓친 것을 발견하거나 내가 잘못 읽은 Tomcat 문서로 안내 할 수 있기를 바라고있다.Tomcat 7 + JNI : UnsatisfiedLinkError : 공유 객체 파일을 열 수 없습니다. 해당 파일 또는 디렉토리가 없습니다.

내가 systemctl stop tomcat 통해 바람둥이를 종료하고 (루트로)과 같이 내 전쟁 파일을 실행하면
07 Apr 2017 10:45:53,140 [ERROR] [... omitted irrelevant log output ...] java.lang.UnsatisfiedLinkError: /opt/omitted-sdk-name/linux_x86_64/bin/libjni_emdq.so: libemdq.so: cannot open shared object file: No such file or directory 

, 내가 UnsatisfiedLinkError를하지 않는 : 톰캣 매니저를 통해 배포 할 때

다음은 오류의 전체 텍스트입니다 :

java -Djava.library.path=/opt/omitted-sdk-name/linux_x86_64/bin -jar /path/to/my/app##0.1.war 

몇 가지 다른 유용한 정보 :

  • CentOS는 7
  • yum을 통한 신선한 바닐라 설치 (관리자의 admin 사용자를 활성화하고 기본 jvm을 전환하는 것을 제외하고는 기본 구성에서 벗어나지 않음).
  • /usr/sbin/tomcat version 쇼 :
 
Server version: Apache Tomcat/7.0.69 
Server built: Nov 6 2016 01:55:51 UTC 
Server number: 7.0.69.0 
OS Name:  Linux 
OS Version:  3.10.0-514.10.2.el7.x86_64 
Architecture: amd64 
JVM Version: 1.8.0_121-b13 
JVM Vendor:  Oracle Corporation 
  • 톰캣 사용자 tomcat 내가이 SDK의 모든 .so를 파일의 tomcatroot에서 소유권을 변경하려고했습니다
  • 로 실행됩니다. 소유자를 변경해도 실제 행동은 변경되지 않았습니다. 예를 들어,이 소유자/모드는 문제를 산출 - 동일한 소유자를 바람둥이로 사용자로 실행, 나는 것들을 해결 한 것입니다 예상 전체 읽기 + 실행 허가 :
     
    [[email protected] bin]# ls -la | grep emdq 
    -rwxr-xr-x 1 tomcat tomcat 403153 Nov 10 03:10 libemdq.so 
    -rwxr-xr-x 1 tomcat tomcat 76850 Nov 10 03:11 libjni_emdq.so 
    
    • 편집
    를 :가 이 컴퓨터에서 Java의 두 버전 인 것 같습니다. root의 경로의 하나이며 1.8.0_77 톰캣 구성된 하나 1.8.0_121이다 .so는 당해 두번째 file
 
[[email protected] tomcat]# java -version 
java version "1.8.0_77" 
Java(TM) SE Runtime Environment (build 1.8.0_77-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode) 
[[email protected] tomcat]# /etc/alternatives/jre_1.8.0_openjdk/bin/java -version 
openjdk version "1.8.0_121" 
OpenJDK Runtime Environment (build 1.8.0_121-b13) 
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) 
  • 표시 출력들은 64 비트 libs가있다 그래서 64 비트 JVM에서 실행에 문제가 있다고 생각하지 않습니다
 
[[email protected] bin]# file libjni_emdq.so 
libjni_emdq.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped 
[[email protected] bin]# file libemdq.so 
libemdq.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped 
  • 내가 $CATALINA_HOME/conf/conf.d/omittedname.conf의 파일에서 이러한 라인을 가지고있다. 과거 어느 시점에서, 나는 tomcat.conf에 넣었지 만 어느 쪽의 위치도 같은 결과를 얻는 것처럼 보입니다.
 
MY_BIN="/opt/omitted-sdk-name/linux_x86_64/bin" 
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$MY_BIN" 
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=$MY_BIN -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -XX:+UseConcMarkSweepGC" 
# needed to run the application 
JAVA_OPTS="$JAVA_OPTS -Dprofile=test" 
  • 편집 :이 게시 후, 나는 root이 경로에 다른 JVM을 가지고 것으로 나타났습니다. 위의 Java 버전도 편집되었습니다.
 
[[email protected] tomcat]# echo $PATH 
/java/jdk1.8.0_77/bin:/opt/omitted-sdk-name/linux_x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 

내가보고 시도 할 수있는 다른 일이 있나요? 가능하면 add a java.io.FilePermissions permission해야합니까?

또한 루트로서 물건을 소유하고 소유하고 있다는 의미를 알고 있다는 겸손한 진술. 내 목표는이 개발 서버를 중단하기 위해 작동중인 Tomcat 관리자 구성으로 돌아가는 것입니다.

+0

* .so 파일의 위치는 어디입니까? 그것은 당신의 경로 환경 변수에 있습니까? 그렇지 않으면 -Djava.library.path = "directory \ containing \ your \ so \ file"을 Tomcat에 지정할 수 있습니다. – yavuzkavus

+0

루트로 로그인하면'$ PATH'는 .so 파일의 위치를 ​​포함합니다. 사용자'tomcat '은 그들에게 할당 된 로그인 셸을 가지고 있지 않습니다 ('/ sbin/nologin'). 나는'JAVA_OPTS'에'java.library.path'를 가지고 있습니다 (하단을보십시오). jvm 인수를 다른 곳에서 지정해야합니까? –

+0

그러나이 컴퓨터에는 여러 버전의 Java가 있습니다. Oracle jdk-1.8.0_77은 루트 경로이지만 Tomcat은'/ etc/alternatives/jdk-1.8.0_121'의 OpenJDK 버전을 사용하도록 구성되어 있습니다. –

답변

0

이 답변은 만족스럽지 않지만 내 문제를 해결하는 열쇠였습니다. 나는 LD_LIBRARY_PATH=/opt/omitted-sdk-name/linux_x86_64/bin 문을 $CATALINA_HOME/conf/conf.d/myapp.conf에서 $CATALINA_HOME/conf/tomcat.conf으로 옮겨야했다. 내가이 일을 마치면 UnsatisfiedLinkError이 사라졌습니다.

관련 문제