ClassLoaderを使用すると、これらの2つのケースが異なる動作をする理由がわかりません。誰かが、ClassLoaderが検索をどのように変更して、なぜそれがJarファイルへの完全なパスを必要とするように変更するのかを説明できますか?.jarリソースをロードするときにClassLoaderを使用する
package com.example;
import java.io.InputStream;
public class SomeClass {
private static InputStream stm;
static {
for (final String s : new String[] { "file.png", "com/example/file.png", "/com/example/file.png" }) {
// case 1 - w/o classLoader
stm = SomeClass.class.getResourceAsStream(s);
System.out.println("w/o : " + (stm == null ? "FAILED to load" : "loaded") + " " + s);
// case 2 - w/ classLoader
stm = SomeClass.class.getClassLoader().getResourceAsStream(s);
System.out.println("w/classloader: " + (stm == null ? "FAILED to load" : "loaded") + " " + s);
}
}
public static void main(final String args[]) {}
}
が生成されますパスはあなたが呼んでgetResourceAsStream()
方法に応じて異なる評価され
w/o : loaded file.png
w/classloader: FAILED to load file.png
w/o : FAILED to load com/example/file.png
w/classloader: loaded com/example/file.png
w/o : loaded /com/example/file.png
w/classloader: FAILED to load /com/example/file.png
あなたが見ている動作は意図的です。これについては、[Class.getResourceのドキュメント](https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResource-java.lang.String- )および[ClassLoader.getResource](https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResource-java.lang.String-)を参照してください。 – VGR
@VGR Class.getResources()は、/を先頭にして/と修飾パッケージ名/名前を使用するので、file.pngはcom/example/file.pngになり、com/example/file.pngはcom/example/com/exampleになります。 /file.pngなので、1番目と2番目の文字列の結果は意味を持ち、/com/example/file.pngはcom/example/file.pngになります。しかし、classLoaderは、 "このメソッドは、リソースの親クラスローダを最初に検索します。"という文を誤解しない限り、w/o出力と一致するはずです。それはなぜですか? – simpleuser
ClassLoader.getResource: "リソースの名前は、リソースを識別する' '/' 'で区切られたパス名です。 "'/'で区切られた一連のパスコンポーネントだけが先頭にはありません。 – VGR