web-dev-qa-db-ja.com

jar内のクラスパスリソース

いくつかのJavaファイルとクラスパスリソースR.txtを含むプロジェクトAがあります。プロジェクト内では、ClassLoader.getSystemResource( "R.txt");を使用してR.txtを取得します。

次に、プロジェクトAのjarファイルを含むプロジェクトBがあります。 getSystemResource( "R.txt")はテキストファイルを検出しません(はい、それはまだjarファイルのルートにあります)。他のサイトで提案されているように「/R.txt」を試しても機能しませんでした。何か案は?

22
Johan Sjöberg

getResourceの代わりにgetSystemResourceを使用して、システムの代わりに特定のクラスローダーに固有のリソースを使用します。たとえば、次のいずれかを試してください。

URL resource = getClass().getClassLoader().getResource("R.txt");
URL resource = Foo.class.getClassLoader().getResource("R.txt");
URL resource = getClass().getResource("/R.txt");
URL resource = Foo.class.getResource("/R.txt");

Class.getResource の代わりに ClassLoader.getResource を呼び出すときは、先頭のスラッシュに注意してください。 Class.getResourceは、先頭にスラッシュがない限り、クラスを含むパッケージに関連していますが、ClassLoader.getResourceは常に絶対値です。

48
Jon Skeet

どうやらあなたのJARはシステムクラスローダーによってロードされていないので、getSystemResource()は機能しません。これは機能するはずです:

_ClassFromProjectA.class.getClassLoader().getResource("R.txt")
_

IMOの方が便利なのは、リソースを使用するクラスと同じパッケージ内にリソースを配置することです。これにより、より短いリソースを使用できます。

_ClassFromProjectA.class.getResource("R.txt")
_

(または、そのクラス内ではgetClass().getResource("R.txt")

5

ClassLoader.getResource() は機能しますか?現時点では、システムクラスローダーを使用するように指定しているだけです。

2
Brian Agnew