1

私のアプリケーションは、JBoss 5.1.0.GA で Spring Framework 3.0.5 を使用しています。フレームワークはサーバーによって提供されます。つまり、フレームワーク ライブラリはserver/<servername>/libディレクトリに配置されます。サーバーはサードパーティによって管理されているため、このサーバーが提供する環境にライブラリを追加することはできません。私のアプリケーションでは cglib を使用する必要があります。Spring はこれをプロキシの目的で使用します。cglib はserver/<servername>/libに含まれていないため、mavencglib-2.2.2.jarを使用してアプリに含めました。.war

問題は、デプロイ時に次のエラーが発生することです。

CGLIB2 が使用できないため、ターゲット クラスをプロキシできません。CGLIB をクラス パスに追加するか、プロキシ インターフェイスを指定します。

アプリ.warで cglib を確認したところ、WEB-INF/libディレクトリに見つかりました。私の知る限り、このディレクトリにあるjar内のすべてのクラスはクラスパスにあり、server/<servername>/lib. Spring が cglib を見つけられないのはなぜですか?

4

1 に答える 1

3

この質問の目的のために、JBoss クラスローダ階層は「下」しか見えません。つまり、システム クラスローダによってロードされたクラスは、アプリケーションの lib ディレクトリ内のクラスを見ることができません。そのため、サーバーの lib ディレクトリにある Spring ライブラリは、アプリの lib ディレクトリにある cglib を認識できません。

考えられる解決策 (優先順):

  1. サーバーの lib ディレクトリから Spring JAR を取り除きます。彼らはそこにいるべきではありません。それは悪い考えです。しかし、あなたはこれができないと言います。
  2. cglib をサーバーの lib ディレクトリに追加します。上記と同じ理由でオプションではありません。
  3. Spring JAR の複製をアプリの lib ディレクトリに追加します。それらがサーバーのものとまったく同じであることを確認してください。そうしないと、奇妙なクラスのバージョン管理の競合が発生する危険があります。これにより、cglib を解決できるようになります。

クラスローダ間でクラスを複製することはクラスローダの問題のレシピであるため、オプション 3 は理想とはほど遠いですが、それが唯一のオプションかもしれません。

于 2012-05-12T20:05:28.903 に答える