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 Deneme diye bir JFrame sınıfınız var ve bu sınıf içerisinde JLabel nesnenizde bir ImageIcon kullanıyorsunuz. Bu 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;

import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Deneme extends JFrame {

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

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

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

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

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

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

package net.tekrei.deneme;

import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.net.URL;

public class Deneme extends JFrame {

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

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

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

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

 private 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.

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

Hiç yorum yok: