2011-06-22 44 views
8

Aynı dizinde (yanı sıra, aynı dizinde) yan yana oturan kullanıcı tarafından yapılandırılabilir birkaç kaynak ile çalıştırılabilir bir kavanoz (maven-derleme eklenti kullanarak) bir uygulama oluşturdum vb.Geçerli çalışma dizini bir Jar çalıştırırken

Komut satırı komut satırından java -jar ... ile çalıştırıldığında, geçerli dizin beklediğiniz gibi olur. Sorun şu ki, bazı işletim sistemlerinde (Ubuntu 11.04), eğer uygulama sadece jarüse çift tıklayarak başlatılıyorsa o zaman mevcut çalışma dizini ana dizindir.

Kavanozun içinde bulunduğu dizini almanın veya kavanoza yan yana duran dış kaynaklara erişmek için başka bir yöntemin almanın tercih edilen bir yolu var mı?

cevap

11

Jütil konumunu bulmak için MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()'u kullanabilirsiniz.

Başka bir alternatif, ilgili sınıfların yanında jaket öğenizdeki diğer salt okunur kaynakları paketlemek olacaktır; böylece, verilen sınıfa göre kaynakları almak için Class.getResource(String) veya Class.getResourceAsStream(String) kullanabilirsiniz.

Örneğin, bir sınıf com.example.icons.Icons sahip olabilir, ve simgeler com/example/Uygulamam/simgeleri/ yolunda Icons.class yanında paketlenmiş olacaktır. senin "açık" düğmesi bir simge adlı open.png kullanır varsayalım:

ImageIcon icon = new ImageIcon(Icons.getResource("open.png")); 
+0

Kodun ilk yığını jar için çalışır, ancak tutulduğu zaman (dosyaları taşıdığım sürece) kırılır. Maalesef, kullanıcının kavanozda depolanması bir seçenek değildir, çünkü kullanıcının bunları yapılandırması gerekebilir. – job

1

İşte kavanoz çalıştığı yerden dizin keşfetmeye benim girişimi.

public class JarLocation { 
    public static void main(String[] args) { 
     new JarLocation().say(); 
    } 

    public void say() { 
     String className = this.getClass().getName().replace('.', '/'); 
     String classJar = 
      this.getClass().getResource("/" + className + ".class").toString(); 
     if (classJar.startsWith("jar:")) { 
      System.out.println("*** running from jar!"); 
     } 
     javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) 
       null, classJar, "jar location", 
       javax.swing.JOptionPane.DEFAULT_OPTION); 
    } 
} 

Önce "." Değiştirerek geçerli sınıfın "yolunu" yapıyorum. "/" ile, sonra .class'ı bir Kaynak olarak alıyorum. Kavanoz olduğu dizin almak için orada ayrıştırma itibaren verilen dize

jar:file:/C:/temp/testing.jar!/my/package/JarLocation.class 

: toString() yöntemi gibi bir şey döndürür.

İlgili konular