2009-07-06 10 views
2

Javaのカスタムクラスローダーからいくつかの異なる.jarからいくつかの異なるクラスをロードしています。私はカスタムURLClassLoaderを作成し、いくつかの.jarsを追加し、それをに渡して、私が望むクラスを見つける。クラスを提供したクラスパスエントリを見つける方法を教えてください。

私の質問は:与えられたクラスは、そこから読み込まれた.jarを見つける方法はありますか?

答えて

2

ClassRoaderでfindResourceを呼び出し、どこから来ているのかわかるようにURLを解析することができます。

+0

これは 'Thread.currentThread()。getContextClassLoader()。findResource(" MyClass.class ")'を使って私のために働いていました。どうもありがとうございました! –

3

例えば、Javaのを使用してjarファイル/クラスを実行すると、それはあなたにそれをロードしたクラスとその起源の完全な荒廃を与える際のパラメータに

-verbose:class 

を設定してみてください:

[Opened /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jsse.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/jce.jar] 
[Opened /usr/java/j2sdk1.4.1/jre/lib/charsets.jar] 
[Loaded java.lang.Object from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 
[Loaded java.io.Serializable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar] 

それはあなたが望むクラス/ jarを見つけるために知る必要があるすべてを与えるはずです。

+0

ああ、いいえ、私は問題を追跡したくありません。私は実際に.jarがどこにあるのかを知りたいので、実行時にそのパスに相対的なものを行うことができます。 –

+0

さて、あなたの問題は私が推測する瓶の場所です。とにかく、それはあなたに関係なく望むJARの正確なパスを与える必要があります... – Jon

+0

私は十分に明確でない場合は申し訳ありません。 -verboseメソッドを使用すると、その情報がstdoutに送信されます。実行時にコード内でファイル操作を実行する必要がありました。私のコードは、私の情報ではなく、その情報を必要としています:) –

5

次のスニペットは、動作するはずです:あなたはgetProtectionDomainやgetCodeSourceを呼び出すときにnullをチェックを追加し、任意の生産コードで適切に処理する必要があります

obj.getClass().getProtectionDomain().getCodeSource().getLocation().toString() 

注意を。 (クラスローダー、セキュリティなどによって異なります)

関連する問題