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にリソース(画像)を
含めるにはこうするものだ。とコピペしてご利用ください。
eclipseでの実行を行うと問題なく動作するのですが、実行可能JARにするとJARは生成されるもののダブルクリックしても何も起こらない現象に悩みネット検索で調べ続けています。
その後そのJARを「java_run.bat」で実行してみると
Resource Error!
Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException at javax.swing.ImageIcon.(Unknown Source)
と続きさらに多数のエラーがでました。
上記問題を解決すべくネット検索しているさなかにこのページに辿り着きました。
このページに記載してある
「src の下にimg/ディレクトリを作って、そこに sample.png を置いています。」
とあるので同様にimgフォルダを用意し画像を配置し、メニューの実行構成のクラスパスのユーザーエントリーにimgフォルダを追加しました。
そしてサンプルコードを参考にしてコードを改変し、画像を”???.png”だったものを”img/???.png”としてみたのですが、実行してみるとコンソールに「URL = null」と表示され、続いて真っ赤なエラーコードが多数吐き出されます。
この問題をどうにか解決したいのでご指導願えませんか?
よろしくお願いします。