jarにする時の注意:リソースはURL指定

 

プログラミングを始めたばかりの頃は、わからない事だらけなワケですが
「なぜ?」と悩んでも仕方がないので「おまじない」と割りきって
コピペするのが早道です。

毎度、管理人イガジーです。

そんなおまじないのひとつが、jarにする時のリソース(画像データ等)の
扱いです(jarに画像を含めてしまう場合の話です)。
普通に、絶対パスや相対パスで画像のファイル名を書いていると
Eclipseから動かしている間は正常にその画像が表示できるのですが
jarにしたとたんに、画像が出なくなってしまいます。

画像をjarに含めてしまうと、通常のパス表記ではアクセスできなくなる
からです。それを回避するには、パスをURL化する必要があります。
具体的には、次のような感じです。

Image im=null;
URL url=this.getClass().getResource("img/sample.png");
try {
	im=this.createImage((ImageProducer) url.getContent());
}catch(Exception ex){
	// System.out.println("Resource Error!");
	im=null;
}

このgetClass()や、getResource()は「おまじない」と思って
深く悩まないようにしましょう。

このurlを System.out.println(url); すると、Eclipse上では
URL=file:/home/mltlab/workspace/JarTest/bin/img/sample.png
と表示されます。
jarにすると(exam.jarという名にして/tmp/jar/に置いて実行すると)
URL=jar:file:/tmp/jar/exam.jar!/img/sample.png
と表示されます。
テストに用いたコードは次の通りで、src の下にimg/ディレクトリを
作って、そこに sample.png を置いています。

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageProducer;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class ResourceURL extends JFrame {
	private static final long serialVersionUID = 1L;
	ResourceURL() {
		Image im=null;
		URL url=this.getClass().getResource("img/sample.png");
		System.out.println("URL="+url);
		try {
			im=this.createImage((ImageProducer) url.getContent());
		}catch(Exception ex){
			System.out.println("Resource Error!");
			im=null;
		}
		ImageIcon ii=null;
		if (im!=null) ii=new ImageIcon(im,"Button1");

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton b1;
		if (ii!=null) b1=new JButton(ii);
		else b1=new JButton("Button1");
		b1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		this.add(b1,BorderLayout.CENTER);
		this.setSize(300,300);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new ResourceURL();
	}
}

jarファイルをunzipで展開してみると

META-INF/MANIFEST.MF
ResourceURL$1.class
ResourceURL.class
img/sample.png

といったファイルがjarに格納されていることが分かります。
このjarの中のimg/sample.png を指すURLが
jar:file:/tmp/jar/exam.jar!/img/sample.png
になるのです。
分かったようで分からないと思いますが、jarにリソース(画像)を
含めるにはこうするものだ。とコピペしてご利用ください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。