ClassLoaderでリソース(URL)を取得
Total: 111255, Today: 1, Yesterday: 3
Posted by aterai at
Last-modified:
Summary
クラスパスからのエントリ(相対パス風)を使って、ClassLoaderからURLを取得します。
Screenshot

Advertisement
Source Code Examples
URL url = getClass().getClassLoader().getResource("example/test.png");
// URL url = Thread.currentThread().getContextClassLoader().getResource("example/test.png");
// URL url = getClass().getResource("test.png");
JLabel icon = new JLabel(new ImageIcon(url));
JLabel path = new JLabel(url.toString());
View in GitHub: Java, KotlinDescription
ClassLoaderを使用して、位置に依存しない方法でリソース(URL)を取得します。
- 例えば
new ImageIcon(String filename)のようにファイルパスを文字列で指定した場合、このファイルパスが位置(カレントディレクトリ)に依存しているため、実行時に別のディレクトリから起動したり、jarファイルにまとめたりするとファイルが参照できなくなる
以下、.\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"); //or MainPanel.class.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");としなくてはならない
クラスパス上に同名のリソースが複数存在する場合は、最初に見つかったものが使用されます。
src.zipをダウンロードして適当な場所に展開するc:\temp\example\test.pngという画像ファイルを別途用意する- 展開したフォルダにある
run.batのクラスパスを以下のように変更(c:\tempを最初に追加)
set MAIN_CLASS=example.MainPanel
rem set CLASSPATH=.\target\classes
set CLASSPATH=c:\temp;.\target\classes
antなどでコンパイルして、修正したrun.batで実行
この場合、src.zipに元々入っていた適当な場所/test.pngではなく、file:/C:/temp/example/test.pngというURLがgetResourceで取得できます。