2017-04-07 144 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消失。

相关问题