技術概要: CentOS 5 で動作する GlassFish v3 にデプロイされた Java Web サービスを開発しています。
私の Web サービスは、ネイティブ ライブラリ (.so) によって提供される機能を使用します。ネイティブ ライブラリは正常に動作しますが、アプリ サーバーを再起動せずに、ネイティブ ライブラリをロードし、Web アプリの再展開の影響を受けないように環境を正しく構成することはあまりうまくいきません。
私がこれまでに行ったことは次のとおりです。
最初に、Web サービス コードにライブラリ (static {System.load(path/to/libabc.so)};) をロードし、すべてのパスが正しく設定され、アプリケーションを再デプロイして、それが不平を言うまで正常に動作します。ライブラリは別の ClassLoader によってロードされます。ネイティブ ライブラリは 1 回しか読み込まれないことがわかりました。
これを解決するために、Web アプリケーションからライブラリ読み込みコードを削除し、Singleton クラスを作成して Lifecyle モジュールにラップし、GlassFish 共有 lib フォルダーにデプロイしてから、起動時にラッパーを実行するように GlassFish を構成しました。これは、特定の 1 つの Web アプリに関連付けられておらず、階層の上位にある ClassLoader によって読み込まれるため、すべての Web アプリケーションがそれを参照できるようになるという考えです。
GlassFish が起動すると、ネイティブ ライブラリが正常にロードされます ( linux> lsof | grep libabc.so )。ただし、Web サービス Java コードでネイティブ メソッドを実行すると、Web サービス コードは UnsatisfiedLinkError で失敗します。Web アプリケーションのコードは、起動時に読み込まれたライブラリにアクセスできないようです。
誰が私が間違っているのか教えてもらえますか?
前もって感謝します。