2011-07-25 9 views
1

2つの違いは何ですか?Javaの読み込みリソースClass.class.getResource対<classname> .class.getResource

私のリソースファイルは、ルートレベルのパッケージにパッケージ化されています。 Class.class.getResource( "/ rec.txt")の呼び出しは、私がテストした特定のケースで動作するように見えました。しかし、私は大きな環境(hadoop)の依存としてこのjarを使用しようとしたとき、このdidntの仕事(nullを返しました)。しかし、コード内の特定のクラスに "Class"を変更すると、それが修正されました。誰かが光を放つことができるだろうか?

答えて

0

Class.getResource()は、getResource()を呼び出したクラスのパスに相対パスを追加して解決します。パスは、 "/"で始まらない限り相対パスであり、その場合、パスはクラスパスのルートに対して解決されます。 ClassLoader.getResource()は、すべてのパスを絶対パスとして解決しますが、パスに "/"を前置してはいけません。それは本当にすべてです。いずれかのメソッドがnullを返す場合、リソースが存在しないことを意味します。

編集:ああ、すみません。私はあなたの質問を十分に注意深く読まず、クラス対クラスの部分を見逃しました。あなたが探している区別は、クラスを介してリソースをロードすることは、関連するClassLoaderに委譲することです。 HadoopがClassLoaderをどのように設定するかはよくわかりませんが、java.lang.ClassクラスはブートストラップClassLoaderによってロードされています。ほとんどの場合、ブートストラップClassLoaderはクラスパス上にjarファイルを持ちません。その中に定義されているリソースを見つけることができません。しかし、自分のクラスは、あなたのjarファイルへのアクセス権を持つClassLoaderによってロードされなければならないので、あなたのリソースをロードすることができます。

+0

私はそれを知っています。注意深く見れば、実際にClassLoaderはありません。 – smartnut007

+0

@smartnut:常にClassLoaderがあります。私の答えを更新しました。 –

3

これが起こっている理由は、getResourceが動作する理由です。それは基本的にあなたの質問に入れて<classname>のclassLoaderへの呼び出しを委任します。

クラスオブジェクトはおそらくエンタープライズアプリケーション内のブートストラップクラスローダーによってロードされていましたが、クラス<classname>は別のクラスローダーによってロードされていました。

+0

ああ、私は参照してください。私がこれを確認するために記録できるものはありますか?または、私がソースで探すことができるものがありますか? – smartnut007

+0

これがどのようにクラスパス内のリソースの可用性に影響を与えるかについてもう少し説明してください。 – smartnut007

+0

@ smartnut007 - 遅く応答して申し訳ありません。 ClassLoader APIを参照することができます。何が役立つかは、問題を特定するためにclassloader.getResource(yourclass)のURLを出力することです。 – Kal

関連する問題