QA@IT

CentOS上のTomcatにてJNIで使用するライブラリへのパスの通し方

9002 PV

初めて投稿します。Servlet初心者です。

現在CentOS 5.5上でTomcat7.0.32を動かし、その上でJNIを使ったライブラリ(他の人が作ったもの)を利用したServletアプリケーションを動かそうとしています。

ローカルPC(Mac OSX 10.7.5)で動かしているTomcatではeclipseを使って開発しているため、環境設定の「Tomcat」 -> 「JVM設定」の「JVMパラメーターへ追加」へライブラリの.jarファイル内でロードされる.dylibファイルのあるディレクトリへのパスを以下のように記述することでアプリケーションは正常に動作します。

-Djava.library.path=/[.dylibのあるディレクトリへのパス]

しかし、これと同じ事をCentOSの方で行おうとして、やり方が分からずに困っています。

ライブラリの提供者に問い合わせたところ、 CATALINA_OPTS に -Djava.library.path を設定すればいいと言われたのですが、 $CATALINA_HOME/bin/startup.sh 内に設定を記述しても相変わらず UnsatisfiedLinkError が投げられてしまいます。

大変お手数おかけすることになってしまいますが、どうすればCentOS上でもパスを通すことができるのか、シェルスクリプトへの理解も十分でないためできるだけ具体的に、どのファイルに対してどのような記述を追加すればいいか、あるいはどのようなコマンドを打てばいいか、など教えていただけると助かります。

よろしくお願いいたします。

回答

CATALINA_OPTS をはじめ、各種環境変数の設定方法については、 $CATALINA_HOME/bin/catalina.sh の冒頭コメントに説明が記述されています。

# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.

この説明にあるように、bin ディレクトリの下に新たに setenv.sh という名前のスクリプトファイルを作成し、その中で CATALINA_OPTS への設定を行えば良いでしょう。

CATALINA_OPTS="-Djava.library.path=(共有ライブラリへのパス)"
編集 履歴 (0)
  • ご回答ありがとうございます。
    教えていただいたとおりsetenv.shへjava.library.pathの記述を行ったのですが、やはりまだUnsatisfiedLinkErrorが投げられてしまいます。
    .dylibは現在$CATALINA_HOME/shared/lib内にあり、ここにパスを通したのですが、この場所などは関係ありますでしょうか。
    すみませんが、ご回答いただければ幸いです。
    -
  • パスを通しているファイルの拡張子は ".dylib" なのですか? これはMacの共有ライブラリの拡張子ですが、Linuxの場合は ".so" になるはずです。例えばLinuxの場合、
    ```java
    System.loadLibrary("hoge");
    ```
    としたら、libhoge.so というファイルを探しに行きます。なので、拡張子が so のファイルにパスを通す必要があります。
    -
  • tomcatの実行ユーザから$CATALINA_HOME/shared/libディレクトリを参照できるなら、それで合っていますよ。後はaoetkさんの仰る様に、JNIで呼び出すライブラリがLinux用か否かです。 -
  • ありがとうございます。aoetkさん、masafuminさんの仰る通り、".so"でなく".dylib"にパスを通していたことが原因だったようです。
    ですが、なぜかまだ次のようなエラーが投げられます。これは、ライブラリの問題であるように見えるので、れならばライブラリ提供者に問い合わせるのですが、そのような認識で間違いありませんでしょうか。
    何度も申し訳ありませんが、よろしくお願い致します。
    -
  • java.lang.UnsatisfiedLinkError: /usr/local/tomcat/shared/lib/libMyScriptEngine.so: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by /usr/local/tomcat/shared/lib/libMyScriptEngine.so) -
  • libMyScriptEngine.soが依存しているライブラリ (ここでは glibc) がインストールされていないとのエラーメッセージですね。依存しているライブラリをOSにインストールする必要があります。
    まずはライブラリ提供者に、OSに事前にインストールすべきライブラリを確認した方がいいと思います。
    -
  • CentOS5.5のglibcは確か2.5くらいだったはず。ライブラリ提供者に該当バージョンでのビルドを依頼しましょう。不可だったら、glibcのバージョンアップですが、これはかなりやばいです。 -
  • aoetkさん、masafuminさん、ありがとうございます。それでは、お教えいただいた情報を元に、ライブラリ提供者に問い合わせてみたいと思います。 複数回に渡ってのご回答、誠にありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。