• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:ClassLoaderでリソースのURLを取得
#navi(../)
*ClassLoaderでリソースのURLを取得 [#m9a3a824]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-05-22~
更新日:&lastmod;

#contents

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

#screenshot

**サンプルコード [#jcd0714c]
#code{{
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を使用した場合、クラスパスからの相対パス与えることで、リソースのURLを取得することができます。
ClassLoaderを使用して、位置に依存しない方法でリソースのURLを取得します。

例えば、.\target\classes\example\test.pngにある画像ファイルのURLを相対パスで取得する場合を考えます。
以下、".\target\classes\example\test.png"にある画像ファイルのURLをクラスパスからの相対パスを使って取得する場合を考えます。

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

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

ClassLoaderからでは無く、Class#getResourceメソッドを使う場合、modified_package_name(このサンプルではパッケージのexampleになる)が補完されるので、以下のように指定します。
----
ClassLoaderからでは無く、Class#getResourceメソッドを使う方法もあります。この場合、リソース名がメソッド内で以下のように変換されます。
-相対パス(頭に/が付かない)の場合
--"." が "/" に変換された、modified_package_nameが名前の前に補完される
--例えば、com.example.Testクラスなら、"com/example/"
--このサンプルではexample.MainPanelクラスなので、"example/"が補完されて、"example/test.png"になる
#code{{
getClass().getResource("test.png");
//getClass().getClassLoader().getResource("example/test.png");と同じ
}}

どちらを使用しても取得できるURLは同じになります。また、上記のように、相対パスで指定しておけば、ファイルがjar内にあっても、Web上でも、ローカルディレクトリの中にあってもURLを取得することができます。
-絶対パス(頭に/が付く)の場合
--modified_package_nameは補完せず、頭の "/" は削除される
#code{{
getClass().getResource("/test.png");
//getClass().getClassLoader().getResource("test.png");と同じ
//上記の相対パスと同じリソースを取得する場合は、
//getClass().getResource("/example/test.png");としなくてはならない
}}

相対パスで示したファイルが、クラスパス上に複数存在する場合は、最初に見つかったものが使用されます。
----
クラスパス上に同じ名前のリソースが複数存在する場合は、最初に見つかったものが使用されます。
+src.zipをダウンロードして適当な場所に展開する
+c:\temp\example\test.png という画像ファイルを別途用意する
+1.で展開したフォルダにあるrun.batの6行目(クラスパス)を以下のように変更
 set LOCALCLASSPATH=c:\temp;.\target\classes
+ant でコンパイルして、修正したrun.batで実行

この場合、src.zipに元々入っていた「適当な場所/test.png」ではなく、「file:/C/temp/example/test.png」というURLがgetResourceで取得できます。

//**参考リンク
**参考リンク [#o584993f]
-[[位置に依存しない方法でのリソースへのアクセス>http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/lang/resources.html]]

**コメント [#z19691a0]
#comment