TITLE:ClassLoaderでリソースのURLを取得

ClassLoaderでリソースのURLを取得

編集者:Terai Atsuhiro
作成日:2006-05-22
更新日:2021-03-30 (火) 11:07:32

概要

リソース名をクラスパスからの相対パスで指定し、ClassLoaderを使ってURLを取得します。

#screenshot

サンプルコード

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;

解説

ClassLoaderを使用して、位置に依存しない方法でリソースのURLを取得します。

以下、".\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が名前の前に補完される
    • 例えば、com.example.Testクラスなら、"com/example/"
    • このサンプルではexample.MainPanelクラスなので、"example/"が補完されて、"example/test.png"になる
      getClass().getResource("test.png");
      //getClass().getClassLoader().getResource("example/test.png");と同じ
      
  • 絶対パス(頭に/が付く)の場合
    • modified_package_nameは補完せず、頭の "/" は削除される
      getClass().getResource("/test.png");
      //getClass().getClassLoader().getResource("test.png");と同じ
      //上記の相対パスと同じリソースを取得する場合は、
      //getClass().getResource("/example/test.png");としなくてはならない
      

クラスパス上に同じ名前のリソースが複数存在する場合は、最初に見つかったものが使用されます。

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

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

参考リンク

コメント