Ana içeriğe atla

Jar İçerisindeki kaynaklara erişme

Sık sık karşılaştığım (ve karşılaşanlarla karşılaştığım) bir sorun jar dosyası şeklinde sunulan bir uygulamada normalde paketler arasındaki bir pakette yer alan resim dosyalarına bu dosyalar jar içerisinde olmasına rağmen erişememe problemidir (Uzun cümlelerden kaçınmam lazım).
Bu sorunla bir kaç kere karşılaştıktan sonra çözümü bulup sürekli uygulamaya başladım. Ve bugün bir arkadaşımın sorusu üzerine bunu günlüğü de yazayım dedim.
Zaten bu yöntemleri kullanmadan önce resim vb. kaynakları ayrı dizinler şeklinde jarın yanında verme gibi bir alışkanlığınız da varsa (benim vardı :) ) bu yöntem sayesinde ondan da kurtulacaksınız.

Gelelim yapmamız gerekene;
Şimdi net/tekrei/deneme/Deneme diye bir JFrame sınıfınız var ve bu sınıf içerisinde JLabel nesnenizde bir ImageIcon kullanıyorsunuz. Bu icondaki resmi net/tekrei/deneme/resim paketi (dizini) altında saklıyorsunuz. Peki jar olarak yayacağınız bu programda bu resme sorunsuz nasıl erişeceğiz? Normal yolları denemeyin olmayacaktır, olursa normal yollardan yapın. Aşağıda normal diye kastettiğim yolu görebilirsiniz:

package net.tekrei.deneme;
public class Deneme2 extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

public Deneme2() {
super();
initialize();
this.setVisible(true);
}

private void initialize() {
this.setSize(300, 200);
this.getContentPane().add(getLblDeneme());
}

private javax.swing.JLabel getLblDeneme() {
javax.swing.JLabel lblDeneme = new javax.swing.JLabel();
lblDeneme.setIcon(getImageIcon());
return lblDeneme;
}

private javax.swing.ImageIcon getImageIcon() {
return new javax.swing.ImageIcon("net/tekrei/deneme/resim/icon.gif");
}

public static void main(String args[]){
new Deneme2();
}
}


Aşağıda bu işin çözümü için yaptığım örnek kodu görebilirsiniz:

package net.tekrei.deneme;
public class Deneme extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

public Deneme() {
super();
initialize();
this.setVisible(true);
}

private void initialize() {
this.setSize(300, 200);
this.getContentPane().add(getLblDeneme());
}

private javax.swing.JLabel getLblDeneme() {
javax.swing.JLabel lblDeneme = new javax.swing.JLabel();
lblDeneme.setIcon(getImageIcon());
return lblDeneme;
}

private javax.swing.ImageIcon getImageIcon() {
return new javax.swing.ImageIcon(getURL("net/tekrei/deneme/resim/icon.gif"));
}

private java.net.URL getURL(String location) {
return Thread.currentThread().getContextClassLoader().getResource(
location);
}

public static void main(String args[]){
new Deneme();
}
}

Bu kodları yazıp programı jar yaptıktan sonra çalıştırırsak (resim paketini de eklemeyi unutmayın) problemsiz çalışacaktır. Ancak ilk yazılan kod (Deneme2 sınıfı) label üzerindeki resmi göstermeyecektir. (Deneme Deneme2)

Not:ImageIcon ile ilgili bir çok farklı yöntem için : http://leepoint.net/notes-java/GUI-lowlevel/graphics/45imageicon.html

Yorumlar