TITLE:ClassLoaderでリソースのURLを取得
#navi(../)
*ClassLoaderでリソースのURLを取得 [#m9a3a824]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-05-22~
更新日:&lastmod;

#contents

**概要 [#yd94964b]
リソースをクラスパス相対パスで指定し、ClassLoaderを使ってURLを取得します。

#screenshot

**サンプルコード [#jcd0714c]
 URL url = getClass().getClassLoader().getResource("example/test.png");
 //URL url = getClass().getResource("test.png");
 JLabel icon = new JLabel(new ImageIcon(url));
 JLabel path = new JLabel(url.toString());

-&jnlp;
-&jar;
-&zip;

**解説 [#fc02caf2]
ClassLoaderを使用した場合、クラスパスからの相対パスでリソースを指定することができます。

例えば、.\target\classes\example\test.pngにある画像ファイルのURLを相対パスで取得する場合を考えます。

上記のサンプルを添付のバッチファイルから実行したときのクラスパスは、次のように設定しています。
 java -classpath ".\target\classes" example.MainPanel

ClassLoader#getResourceメソッドを使用する場合は、以下のようにクラスパスからの相対パス(/区切り)を引数にします。
 getClass().getClassLoader().getResource("example/test.png");
 //getClass().getClassLoader().getResource("./example/test.png");
 //だとjar内にパッケージした時うまくいかない。

ClassLoaderからでは無く、Class#getResourceメソッドを使う場合、modified_package_name(このサンプルではパッケージのexampleになる)が補完されるので、以下のように指定します。
 getClass().getResource("test.png");

どちらを使用しても取得できるURLは同じになります。また、上記のように、相対パスで指定しておけば、ファイルがjar内にあっても、Web上でも、ローカルディレクトリの中にあってもURLを取得することができます。

相対パスで示したファイルが、クラスパス上に複数存在する場合は、最初に見つかったものが使用されます。

例えば、

+src.zipをダウンロードして適当な場所に展開する
+c:\temp\example\test.png という画像ファイルを別途用意する
+1.で展開したフォルダにあるrun.batの6行目(クラスパス)を以下のように変更
 set LOCALCLASSPATH=c:\temp;.\target\classes
+ant でコンパイルして、修正したrun.batで実行

すると、src.zipに入っていたtest.pngではなく、URLはfile:/C/temp/example/test.png となります。




//**参考リンク
**コメント [#z19691a0]
#comment