2016-06-30 10 views
0

私はTomcat7とUbuntuを使用しています。私はいくつかのネイティブライブラリを使用するJava Webアプリケーションを持っています。 Eclipse内でWebアプリケーションを実行すると、デバッグ中にEclipse内部のTomcatサーバーを介して動作します。しかし、アプリケーションをホストされたTomcatサービスにデプロイすると、アプリケーションがこれらのライブラリをロードする時点に達したときにアプリケーションが失敗します。Tomcat(サービスとして)はJava Webアプリケーションのネイティブライブラリをロードしませんか?

  1. 私は「Tomcat7」ホーム/私/ my_shared_libs /でネイティブライブラリを入れて、ユーザーに
    フォルダとファイルの所有権を与えた - sudo chown
  2. を私はネイティブライブラリへの「Tomcat7」のすべての権限を与えますユーザー - sudo chmod
  3. sudo vi /usr/share/tomcat7/bin/setenv.shを行うには、ファイルexport CATALINA_OPTS="-Djava.library.path=/home/me/my_shared_libs"
  4. で次 を入れてそれから私は、Tomcatを再起動 - sudo service tomcat7 restartそして、いつでも 参照ネイティブライブラリへの参照に達しました。InvocationTargetExceptionというエラーが表示されます。

また、アプリケーションの.WARファイルの一部としてネイティブライブラリを追加するオプションもあります。 (私はEclipseでこれを行う方法がわかりませんが)。

/var/log/tomcat7/catalina.outのログ - >

Jun 30, 2016 8:11:50 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 3643 ms 
Load my_native_lib_called. libmachoman.so: cannot open shared object file: No such file or directory 

EDIT: 私は非常に面白いものを見つけました。 Tomcatは上で設定したライブラリの場所を取得します。何が起こるかは、場所に2種類のライブラリ(.so)ファイルがあることです。最初のライブラリ(libcore.so)は、2番目のライブラリ(libmachoman.so)を呼び出し/ロードします。 libcore.soは見つかってロードされますが、libmachoman.soは両方とも同じ場所にあるにもかかわらず、ロードされません。

+1

起動ログにライブラリパスが設定されていますか? – 11thdimension

+0

@ 11th Dimensionありがとうございます。いいえ、私はTomcatが私が上で設定したパスを取得したのを見ていません。この新しい知識をありがとう。どうすればそれが保証されますか?私は質問にtomcatのログを追加しました。 – nikk

+0

質問タイトルでは、tomcatがサービスとして実行されていると述べています。サービスを作成するスクリプトを見つけることができ、そこにTomcatのパラメータを追加することができます。 – 11thdimension

答えて

0

頭痛の日後、私は解決策があります。

  1. 編集ファイル

    須藤VIは/etc/ld.so.conf

  2. ファイル

    ネイティブLIBSの位置を追加は/etc/ld.so.confを含みます。 D/*。confに /ホーム/私/ my_shared_lib

  3. 負荷設定

    にsudo ldconfigを

  4. ビュー新しい変更

    のldconfigの-p | grep my_shared_lib

これは、ネイティブライブラリを探す場所をダイナミックリンカに指示します。

私の問題は解決しました。

その他の代替ソリューションhereがありますが、これにはいくつかの欠点がある場合もあります。

また、上記の手順の代わりに、/ usr/share/tomcat7/bin /の下のsetenv.shファイルでLD_LIBRARY_PATHをエクスポートすることもできます。設定はTomcatの一部になります。よりクリーンなアプローチ。

1

コード自体から行うことができます。それはあなたにライブラリの読み込みに自信を与えるはずです。このアプリケーションは、ライブラリ関数を呼び出す前に、起動時に一度、実行

System.load("/PATH/TO/.so"); 

例えばコード1のこの部分をライブラリーの絶対パスを受け取りSystem.load()

を使用することができますを行うには

ライブラリをすべてのサーバー上のカスタムの場所に配置する必要があります。

System.loadLibrary()も同じ目的で使用されますが、違いは、名前でライブラリをロードし、Java環境変数java.library.pathで指定された場所を調べる点です。

しかし、この変更はtomcatのすべてのインスタンスで実行する必要があります。

+0

私はさらに見て、少なくとも最初のライブラリについてはライブラリの場所が問題ではないかもしれないことを見てください。それは2次ライブラリを呼び出します。最初のライブラリは、2番目のライブラリを包むラッパーです。最初のファイルが見つかってロードされました。したがって、catalina.outファイルにエラーはありませんが、最初のライブラリがロードされるポイントに到達するたびに、2番目のライブラリが見つかりません。これは、アプリケーションがスタンドアロンとしてうまく機能するため、奇妙です。更新された質問。 – nikk

+0

スタンドアロン版では、 'System.getProperty(" java.library.path "')を印刷し、Webアプリケーションで同じものを印刷し、印刷された値を比較してヒントを与えます。 – 11thdimension

+0

Javaアプリケーションでは、 'System.loadLibrary(" lib_mymainlib.so ")'を使って初期ライブラリを読み込み、2番目のライブラリは 'dlopen(" lib_mynative_lib.so "、1)'としてネイティブコードに読み込まれます。 それは違いがあるのだろうかと思います。私はアドバイスとしてデバッグメッセージを追加しようとします。 – nikk

関連する問題