Tomcat 7 + JNI: UnsatisfiedLinkError: cannot open shared object file: No such file or directory
Tomcat 7 + JNI: UnsatisfiedLinkError: cannot open shared object file: No such file or directory
这是我的问题:我有一个 WAR 文件,其中包含我的 webapp,并且在其 WEB-INF/lib 中有一个 .jar,这取决于 .so 文件出现在 [=81] 的主机上=]是运行宁。当我通过应用程序管理器部署我的 WAR 文件时,当从 .jar 加载 JNI 包装器 class 时,我在启动日志中得到一个 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 并像这样(作为 root)执行我的 war 文件,我不会得到 UnsatisfiedLinkError
:
java -Djava.library.path=/opt/omitted-sdk-name/linux_x86_64/bin -jar /path/to/my/app##0.1.war
其他一些有用的信息:
- CentOS 7
- 通过 yum 进行全新的香草安装(与默认配置没有任何偏差,除了在管理器上启用管理员用户并切换默认 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
。改变所有者并没有改变实际行为。例如,这个 owner/mode 会产生问题 - 与 tomcat 运行 相同的所有者 - 作为用户,以及完整的读取+可执行权限,我希望它能解决问题:
[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)
-
file
在两个 .so 上的输出显示它们是 64 位库,所以我认为 运行ning 在 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
还有什么我可以尝试看的吗?我可能需要 add a java.io.FilePermissions permission 吗?
此外,我只是一个谦虚的声明,我是 war 作为根的 running/owning 事物的含义。我的目标只是恢复正常工作的 tomcat 管理器配置以取消破坏此开发服务器。
这个答案不太令人满意,但它是解决我问题的关键。我不得不将语句 LD_LIBRARY_PATH=/opt/omitted-sdk-name/linux_x86_64/bin
从 $CATALINA_HOME/conf/conf.d/myapp.conf
移动到 $CATALINA_HOME/conf/tomcat.conf
。在我这样做之后,UnsatisfiedLinkError
消失了。
这是我的问题:我有一个 WAR 文件,其中包含我的 webapp,并且在其 WEB-INF/lib 中有一个 .jar,这取决于 .so 文件出现在 [=81] 的主机上=]是运行宁。当我通过应用程序管理器部署我的 WAR 文件时,当从 .jar 加载 JNI 包装器 class 时,我在启动日志中得到一个 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 并像这样(作为 root)执行我的 war 文件,我不会得到 UnsatisfiedLinkError
:
java -Djava.library.path=/opt/omitted-sdk-name/linux_x86_64/bin -jar /path/to/my/app##0.1.war
其他一些有用的信息:
- CentOS 7
- 通过 yum 进行全新的香草安装(与默认配置没有任何偏差,除了在管理器上启用管理员用户并切换默认 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
。改变所有者并没有改变实际行为。例如,这个 owner/mode 会产生问题 - 与 tomcat 运行 相同的所有者 - 作为用户,以及完整的读取+可执行权限,我希望它能解决问题:
[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)
-
file
在两个 .so 上的输出显示它们是 64 位库,所以我认为 运行ning 在 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
还有什么我可以尝试看的吗?我可能需要 add a java.io.FilePermissions permission 吗?
此外,我只是一个谦虚的声明,我是 war 作为根的 running/owning 事物的含义。我的目标只是恢复正常工作的 tomcat 管理器配置以取消破坏此开发服务器。
这个答案不太令人满意,但它是解决我问题的关键。我不得不将语句 LD_LIBRARY_PATH=/opt/omitted-sdk-name/linux_x86_64/bin
从 $CATALINA_HOME/conf/conf.d/myapp.conf
移动到 $CATALINA_HOME/conf/tomcat.conf
。在我这样做之后,UnsatisfiedLinkError
消失了。