2011-11-15 3 views
4

..私はプラグイン可能なプラグインが.jarの.jarであるプラグインシステムを持つアプリケーション(a .war)を持っています依存関係。 webappでは、管理者用Webインターフェイス経由で、プラグインは.jarとその依存関係を「読み込む」ClassLoaderを使って読み込まれます。 しかし、問題は、たとえば、2つのプラグインAとBが1つ以上の共通の依存関係(commons-io.jar、commons-collection.jar、...)を持つ可能性があるということです。一度、すでに別のプラグインによってロードされている.jar、または既にWebアプリケーション自体に存在していた - > WEB-INF/lib/ 別の時刻に.jarをロードしない方法があるかどうかを知りたいwebappや別のプラグインを使用して既に読み込まれています 可能であれば、どうすればいいですか?.jarまたはクラスがJavaのClassLoaderによって既にロードされていることを確認する方法

実際、利用可能なソリューションが何であれ、私はクラスローダーの問題を回避したいだけです。

注:各プラグインは、以下のアーキテクチャは

プラグイン名/

 - code/ 

      - A.class 

      - B.class 

      - ... 

     - lib/ 

      - commons-io.jar 

      - log4j.jar 

      - .... 

     - description.xml 

     - version.txt 

ディレクトリコード内の各の.classファイル/クラスローダによってロードされ、その中に持っている.zipファイルでありますプラグインのlib /ディレクトリにある各.jarもロードされます。

しかし、通常、私は「コモンズ-io.jarは」今までならば、それはすでに存在していたの.jarに存在するクラスを再ロードするべきではありません...私は私は十分に明らかにされてきた期待し

、感謝事前に注意を払い、助けてください。

+0

2つのプラグインが同じ依存関係の異なるバージョンを必要とする可能性はありますか?それとも心配しないのですか? – kylewm

+0

はい、2つのプラグインが同じ依存関係の異なるバージョンを持つ可能性があります – paissad

答えて

6

は、あなたがJVMを起動する前に、あなたのオプションに

-verbose:class 
Display information about each class loaded. 

を追加することができますJVMによってロードされるクラストレースします。

それをWILLEあなたが-verbose:class JVMオプションを使用する場合、彼らは負荷としてA Sun Microsystemsの互換JVMもクラスが表示されます

[Opened C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar] 
[Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar] 
1

のような出力を作成します。ただし、では、この情報にプログラムでアクセスすることはできません。

0

JavaファイルまたはJARがロードされているかどうかを知りたい場合は、ロードしないでロードする必要がありますか?私が得る1つの解決策は、クラスパスにjarが存在するかどうかを確認できるようなものです。

関連する問題