7

技術概要: 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 アプリケーションのコードは、起動時に読み込まれたライブラリにアクセスできないようです。

誰が私が間違っているのか教えてもらえますか?

前もって感謝します。

4

2 に答える 2

4

「ライフサイクル モジュール」についてはあまり言えません (GlassFish にデプロイされたアプリケーションから「見える」ようになっているかどうかはわかりません) が、...

実際、JNI ライブラリと、System.loadLibrary(String)シングルトンなどを呼び出すクラスを webapp の外に配置し、このコードをdomain/liborにデプロイしますdomain/lib/applibs(詳細については 、V3 のファイル レイアウトこのスレッドを参照してください)。

これにより、コードがアプリケーションに表示され、アプリケーションが再デプロイされにくくなります。

于 2010-02-23T15:12:34.467 に答える
2

解決しました!

最後に、ピースをまとめます。

欠落している部分JNIライブラリ(例jni_wrapper_for_libabc.jar)をGF共有フォルダに追加し、domains/domain1/lib機能しました。ネイティブライブラリは、GFの起動時に呼び出されるライフサイクルモジュールのシングルトンクラスによってロードされます。

パスカル、ありがとうございました!

乾杯

于 2010-02-27T14:30:06.330 に答える