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

ClassLoaderでリソースのURLを取得

編集者:Terai Atsuhiro~

作成日:2006-05-22
更新日:2021-03-30 (火) 11:07:32
  • category: swing folder: ClassLoader title: ClassLoaderでリソース(URL)を取得 tags: [ClassLoader, Resource, URL] author: aterai pubdate: 2006-05-22T09:59:23+09:00 description: クラスパスからのエントリ(相対パス風)を使って、ClassLoaderからURLを取得します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTI-UTFN-I/AAAAAAAAATo/6sdQoVO0Kc4/s800/ClassLoader.png

概要

クラスパスからのエントリ(相対パス風)を使って、ClassLoaderからURLを取得します。

概要

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

サンプルコード

#spanend
#spanadd
URL url = getClass().getClassLoader().getResource("example/test.png");
#spanend
#spanadd
// URL url = Thread.currentThread().getContextClassLoader().getResource("example/test.png");
#spanend
#spanadd
// URL url = getClass().getResource("test.png");
#spanend
#spanadd
JLabel icon = new JLabel(new ImageIcon(url));
#spanend
#spanadd
JLabel path = new JLabel(url.toString());
#spanend
#spanadd
View in GitHub: Java, Kotlin

#screenshot

解説

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

サンプルコード

  • 例えばnew ImageIcon(String filename)のようにファイルパスを文字列で指定した場合、このファイルパスが位置(カレントディレクトリ)に依存しているため、実行時に別のディレクトリから起動したり、jarファイルにまとめたりするとファイルが参照できなくなる
以下、.\target\classes\example\test.pngにある画像ファイルのURLをクラスパスからのエントリ(相対パス風)を使って取得する場合を考えます。 上記のサンプルに添付しているバッチファイルでは、クラスパスは次のように設定しています。
java -classpath ".\target\classes" example.MainPanel
ClassLoader#getResourceメソッドを使用する場合は、以下のようにクラスパスからのエントリを使用します。このエントリは、相対パス風で頭に/は付けず、/区切りで記述します。
 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());
#spanadd
getClass().getClassLoader().getResource("example/test.png");
#spanend
#spanadd
// ただし、getClass().getClassLoader().getResource("./example/test.png");
#spanend
#spanadd
// だとjar内にパッケージした場合で失敗する
#spanend
  • &jnlp;
  • &jar;
  • &zip;

解説

ClassLoaderを使用した場合、クラスパスからの相対パス与えることで、リソースのURLを取得することができます。
  • - ClassLoaderからでは無く、Class#getResourceメソッドを使う方法もあります。この場合、エントリ名がメソッド内で以下のように変換されます。
例えば、.\target\classes\example\test.pngにある画像ファイルのURLを相対パスで取得する場合を考えます。
  • 相対パス風(頭に/が付かない)の場合
    • ./に変換された、modified_package_nameが名前の前に補完される
    • 例えば、com.example.Testクラスなら、com/example/
    • このサンプルではexample.MainPanelクラスなので、example/が補完されて、example/test.pngになる
上記のサンプルを添付のバッチファイルから実行したときのクラスパスは、次のように設定しています。
java -classpath ".\target\classes" example.MainPanel
#spandel
ClassLoader#getResourceメソッドを使用する場合は、以下のようにクラスパスからの相対パス(/区切り)を引数にします。
#spanend
 getClass().getClassLoader().getResource("example/test.png");
 //getClass().getClassLoader().getResource("./example/test.png");
 //だとjar内にパッケージした時うまくいかない。
#spanadd
getClass().getResource("test.png"); //or MainPanel.class.getResource("test.png");
#spanend
#spanadd
// getClass().getClassLoader().getResource("example/test.png");と同じ
#spanend
ClassLoaderからでは無く、Class#getResourceメソッドを使う場合、modified_package_name(このサンプルではパッケージのexampleになる)が補完されるので、以下のように指定します。
  • 絶対パス風(頭に/が付く)の場合
    • modified_package_nameは補完せず、頭の/は削除される
 getClass().getResource("test.png");
#spanadd
getClass().getResource("/test.png");
#spanend
#spanadd
// getClass().getClassLoader().getResource("test.png");と同じ
#spanend
#spanadd
// 上記の相対パスと同じリソースを取得する場合は、
#spanend
#spanadd
// getClass().getResource("/example/test.png");としなくてはならない
#spanend
どちらを使用しても取得できるURLは同じになります。また、上記のように、相対パスで指定しておけば、ファイルがjar内にあっても、Web上でも、ローカルディレクトリの中にあってもURLを取得することができます。
  • - クラスパス上に同名のリソースが複数存在する場合は、最初に見つかったものが使用されます。
相対パスで示したファイルが、クラスパス上に複数存在する場合は、最初に見つかったものが使用されます。
  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をダウンロードして適当な場所に展開する
  • c:\temp\example\test.pngという画像ファイルを別途用意する
  • 展開したフォルダにあるrun.batのクラスパスを以下のように変更(c:\tempを最初に追加)
この場合、src.zipに元々入っていた「適当な場所/test.png」ではなく、「file:/C/temp/example/test.png」というURLがgetResourceで取得できます。
#spanend
#spanadd
set MAIN_CLASS=example.MainPanel
#spanend
#spanadd
rem set CLASSPATH=.\target\classes
#spanend
#spanadd
set CLASSPATH=c:\temp;.\target\classes
#spanend
#spanadd

コメント

  • antなどでコンパイルして、修正したrun.batで実行
この場合、src.zipに元々入っていた適当な場所/test.pngではなく、file:/C:/temp/example/test.pngというURLgetResourceで取得できます。

参考リンク

コメント