• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:ClassLoaderでリソース(URL)を取得
#navi(../)
RIGHT:Posted by [[terai]] at 2006-05-22
*ClassLoaderでリソース(URL)を取得 [#v8918bae]
クラスパスからのエントリ(相対パス風)を使って、ClassLoaderからURLを取得します。

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

#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());
}}

**解説 [#fc02caf2]
ClassLoaderを使用して、位置に依存しない方法でリソース(URL)を取得します。

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

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

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

----
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");と同じ
}}

-絶対パス風(頭に/が付く)の場合
--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]]
-[[How to Use Icons (The Java™ Tutorials Creating a GUI with JFC/Swing Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html#getresource]]

**コメント [#z19691a0]
- 「クラスパスからのパス」などの意味が分かり辛いので、[[JarURLConnection (Java Platform SE 6)>http://java.sun.com/javase/ja/6/docs/ja/api/java/net/JarURLConnection.html]]を参考にして「パス」を「エントリ」に変更してみました。 -- [[terai]] &new{2008-02-15 (金) 18:04:14};

#comment