jarファイルに画像リソースを含める


IntelliJからjarファイルを出力すると、画像が表示されなくなる問題

Swingを用いたGUIツールを作製したとき、IntelliJ上で実行した場合は画像ファイルがきちんと表示されるが、jarファイルとして出力すると画像ファイルうまく表示できなくなるという問題に直面した。
ググったところ、よく知られた現象らしく、解決策もすぐに出てきた。以下はその解決策を自分用のメモとしてまとめたものである。

状況説明

JavaのGUIツールキットであるSwingを練習するため、砂時計アイコンが表示されるだけの簡単なプログラムを作製していた。

こんなの

アイコンはhourglass.pngファイルという名前で、srcフォルダ直下に保存した。また、アイコンファイルの読み込みは以下のように記した。
ImageIcon myIcon = new ImageIcon("hourglass.png");

このコードをIntelliJ上で実行すると、砂時計アイコンがきちんと表示されたプログラムが実行される。
しかし、jarファイルを出力し、ターミナル上からプログラムを実行すると、以下のようにアイコンが表示できなくなってしまう。

解決策

ClassLoader.getResource()を利用する。

Javaでは、ファイルなどのリソース情報を取得する処理としてClassLoader.getResource()が用意されている。

先のコードでImageIcon myIcon = new ImageIcon("hourglass.png");としていた記述を、


ClassLoader cl = this.getClass().getClassLoader();
ImageIcon myIcon = new ImageIcon(cl.getResource("hourglass.png"));

と書き換えることで、jarファイルとして出力した後も、画像リソースがちゃんと参照されるため、画像が表示されるようになる。

やったね

参照元

https://virtualwalk.hatenadiary.org/entry/20121013/1350127275
http://hiesuke.hatenablog.com/entry/2016/12/30/101639