0

アプリケーション サーバー (WebLogic)の共有ライブラリに入れたい jar ファイルがあります。jar には、 war デプロイメント内にあるインターフェースを実装するいくつかのクラスが含まれています。また、デプロイメントには、共有 jar に含まれるクラスを初期化する Spring シングルトンがあります。

だから私が推測するのは、インターフェースがまだロードされていない(デプロイメントにある)ため、クラスをロードできず、クラスローダーがそのクラスをロードしようとすると、おそらくコンパイルエラーが発生することです(私にはわかりませんロードされていないもの (共有 jar) をデプロイメントがインスタンス化しようとすると、エラーが発生します。

問題は、ここで何をするかです。これらすべてが機能するように構成するにはどうすればよいですか? 共有フォルダー内のすべてのインターフェースを含む jar を複製したくありません。(1 つの .war ファイル全体である必要があります)。

ありがとう。

PS 残念ながら、ドメイン lib (共有) フォルダーのクラスロード中にエラー/例外はありません。インスタンス化しようとすると、java.lang.NoClassDefFoundErrorしかありません。

4

1 に答える 1

1

共有 lib ディレクトリを使用したくないと思います。war を変更したり、複数の成果物を持たせたりせずに、顧客の jar を単一の war のクラスパスに追加したいようです。私には2つの方法があります。どちらもローカル ファイル システムを直接指定する必要がありますが、これは通常、Web アプリケーションではお勧めできません。オプションの顧客提供のクラスを指しているので、ここではおそらく問題ないと思います。肝心なのは、この拡張メカニズムは Web アプリケーションの外部から変更できるということです。ただし、これは、顧客が手動ですべてのシステムに同じように jar を展開する必要があることを意味します。これはクラスターでは面倒な作業になる可能性があり、アプリケーションサーバーへのファイルシステムへの直接アクセスが必要になることは明らかです。

  1. これが機能するかどうかは覚えていませんが、クラスパスが戦争の外を指す META-INF/MANIFEST.MF を持つ webapp の WEB-INF/lib に jar を配置できるはずです。これは、ハードコーディングされた既知の場所である必要があります。現在の作業ディレクトリに相対的な相対パスにすることができます。多くの場合、これはアプリサーバーのホーム ディレクトリまたはドメインのホーム ディレクトリです。

  2. 独自の ClassLoader インスタンスを構築します。これはおそらく URLClassLoader である必要があるため、顧客にディレクトリまたは単一の jar ファイルを提供してもらうことができます。このクラスローダの親を Web アプリケーションのクラスローダに設定します。実行時に決定された場所を指すことができます。ここでの問題は、このクラスローダを適切な場所で使用することです。一般的な方法がわからないので、最初のオプションをお勧めします。

于 2012-06-26T10:25:07.950 に答える