2017-04-07 143 views
1

這是我的問題:我有一個WAR文件,其中包含我的webapp,並在其WEB-INF/lib中依賴於.jar。所以文件將出現在運行Tomcat的主機上。當我通過應用程序管理器部署我的WAR文件時,當從.jar加載JNI包裝類時,我在啓動日誌中獲得UnsatisfiedLinkError: file not found。當我查看鏈接庫所在的目錄時,它們顯然是存在的,並且具有世界讀取和執行權限,我甚至將所有者更改爲與執行tomcat的運行用戶相同。我相當肯定這是一個權限問題,因爲我可以在命令行上執行WAR文件,並且我不會收到錯誤。我希望有人能夠發現我錯過的東西,或者直接指向我誤解的一些Tomcat文檔。Tomcat 7 + JNI:UnsatisfiedLinkError:無法打開共享目標文件:沒有這樣的文件或目錄

下面是錯誤的全文通過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 

如果我通過systemctl stop tomcat關閉Tomcat和執行我的戰爭文件類似這樣(以root權限),我沒有得到UnsatisfiedLinkError

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

其他一些有用的信息:

  • CentOS的7
  • 新鮮,香草安裝通過百勝(沒有偏離默認配置,除了在管理器上啓用管理員用戶並切換默認的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作爲用戶tomcat
  • 我試圖從root更改所有權在此SDK所有.so文件的tomcat。改變業主並沒有改變實際的行爲。例如,該業主/模式產生的問題 - 相同的所有者是tomcat運行作爲用戶和全讀+可執行權限,這是我預料將有固定的東西:
 
[[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和一個構造成用於Tomcat是1.8.0_121:的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位庫,所以我不認爲有在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文件位於何處?它是否在你的路徑環境變量上?如果沒有,你可以指定Tomcat的-Djava.library.path =「directory \ containing \ your \ so \ file」。 – yavuzkavus

+0

以root身份登錄,'$ PATH'確實包含.so文件的位置。用戶'tomcat'沒有分配給他們的登錄shell('/ 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消失。

相關問題