私の問題です:私は自分のwebappとそのWEB-INF/libに依存する.jarを含むWARファイルを持っています。 Tomcatが動作しているホスト上に存在するファイル。 JNIラッパークラスが.jarからロードされたときに、アプリケーションマネージャを使用してWARファイルをデプロイすると、スタートアップログにUnsatisfiedLinkError: file not found
が表示されます。リンクされたライブラリが存在するディレクトリを見ると、それらは明らかに存在し、世界の読み取りと実行の権限を持ち、所有者をtomcatを実行する同じ実行ユーザーに変更しました。私は、コマンドラインでWARファイルを実行できるので、これはパーミッションの問題であると確信していますが、エラーは発生しません。誰かが私が見逃してしまったものを見つけることができることを願っています。あるいは誤って読んだTomcatのドキュメンテーションに私を導いてくれます。 Tomcatマネージャ経由で展開されたときにここでTomcat 7 + JNI:UnsatisfiedLinkError:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません
は、エラーの全文です:
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
ショー:Tomcatがユーザーtomcat
- として実行されている
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
- 私は、このSDKのすべての.soファイルの
tomcat
へroot
から所有権を変更しようとしました。所有者を変更しても、実際の動作は変更されませんでした。
[[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
- EDIT:そこをTomcatが実行のように、ユーザと同じ所有者を、と私は予想完全な読み込み+実行可能権限は、物事を固定しているだろう - たとえば、この所有者/モードは、問題を生み出しますこのマシンではJavaの2つのバージョンと思われます。
root
のパス内の1つは、1.8.0_77とTomcatの構成された一つは1.8.0_121ある:.soの質問に2つに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"
- EDIT:これを掲示した後、私は
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マネージャの作業環境設定に戻ることです。
* .soファイルはどこにありますか?それはあなたのパス環境変数にありますか?そうでなければ、-Djava.library.path = "directory \ containing \ your \ so \ file"をTomcatに指定することができます。 – yavuzkavus
rootとしてログインすると、 '$ PATH'は.soファイルの場所を含みます。ユーザ 'tomcat'にはログインシェルが割り当てられていません('/sbin/nologin')。私は 'JAVA_OPTS'に' java.library.path'を持っています(下を見てください)。 jvm引数を別の場所に指定する必要がありますか? –
しかし、このマシンにはいくつかのバージョンのJavaがあります。 Oracleのjdk-1.8.0_77はrootのパスにありますが、Tomcatは '/ etc/alternatives/jdk-1.8.0_121'のOpenJDKバージョンを使用するように設定されています。 –