繁体   English   中英

Tomcat 7 + JNI:UnsatisfiedLinkError:无法打开共享对象文件:没有这样的文件或目录

[英]Tomcat 7 + JNI: UnsatisfiedLinkError: cannot open shared object file: No such file or directory

这是我的问题:我有一个WAR文件,其中包含我的webapp,以及WEB-INF / lib中的.jar,它依赖于.so文件存在于运行Tomcat的主机上。 当我通过应用程序管理器部署我的WAR文件时,我从.jar加载JNI包装器类时,在启动日志中UnsatisfiedLinkError: file not found 当我查看链接库所在的目录时,它们显然存在,并具有世界读取和执行权限,我甚至将所有者更改为执行tomcat的同一运行用户。 我相当肯定这是一个权限问题,因为我可以在命令行上执行WAR文件,而且我没有收到错误。 我希望有人可以发现我错过的东西,或者直接告诉我一些我误读的Tomcat文档。

以下是通过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 systemctl stop tomcat并像这样执行我的war文件(作为root),我不会得到UnsatisfiedLinkError

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

其他一些有用的信息:

  • CentOS 7
  • 通过yum安装新鲜的vanilla(没有偏离默认配置,除了在管理器上启用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以用户tomcat身份运行
  • 我试过在这个sdk中将所有.so文件的所有权从root更改为tomcat 更改所有者并未改变实际行为。 例如,这个所有者/模式产生问题 - 与tomcat run-as用户相同的所有者,以及完全读取+可执行权限,我希望它具有固定的东西:
[root@omitted-host 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:
[root@omitted-host 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)
[root@omitted-host 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)
  • 两个.so上的file输出显示它们是64位库,所以我不认为在64位JVM中运行有问题:
[root@omitted-host bin]# file libjni_emdq.so
libjni_emdq.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
[root@omitted-host 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版本也被编辑了。
[root@omitted-host 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

还有什么我可以尝试看的吗? 我是否可能需要添加java.io.FilePermissions权限

另外,只是一个简单的陈述,我知道以root身份运行/拥有东西的含义。 我的目标只是回到一个有效的tomcat管理器配置来取消破坏这个开发服务器。

这个答案不太令人满意,但它是解决我的问题的关键。 我不得不将$CATALINA_HOME/conf/conf.d/myapp.conf的语句LD_LIBRARY_PATH=/opt/omitted-sdk-name/linux_x86_64/bin $CATALINA_HOME/conf/conf.d/myapp.conf$CATALINA_HOME/conf/tomcat.conf 在我这样做之后, UnsatisfiedLinkError消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM