2011-06-22 30 views
8

Stworzyłem aplikację, która jest działającym słojem (przy użyciu wtyczki do tworzenia grup) z kilkoma konfigurowanymi przez użytkownika zasobami, które znajdują się obok niego w tym samym katalogu (obrazy, właściwości, itp.)Bieżący katalog roboczy podczas pracy z Jar

Podczas uruchamiania słoika z wiersza poleceń przy pomocy java -jar ... bieżący katalog jest zgodny z oczekiwaniami. Problem polega na tym, że w niektórych systemach operacyjnych (Ubuntu 11.04), jeśli aplikacja zostanie uruchomiona przez podwójne kliknięcie słoika, bieżącym katalogiem roboczym jest katalog domowy.

Czy istnieje preferowany sposób pobrania bieżącego katalogu, w którym znajduje się słoik, lub innej metody uzyskiwania dostępu do zasobów zewnętrznych, które znajdują się obok słoika?

Odpowiedz

11

Możesz użyć MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath(), aby uzyskać lokalizację pliku jar.

Inną opcją jest spakowanie innych zasobów tylko do odczytu w pliku jar wraz z powiązanymi klasami, aby można było używać zasobów w stosunku do danej klasy, używając Class.getResource(String) lub Class.getResourceAsStream(String).

Na przykład można mieć klasę com.example.icons.Icons i ikony zostaną zapakowane wraz Icons.class w com/example/myapp/icons/ ścieżce. Załóżmy, że przycisk „open” używa się ikona o nazwie open.png:

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

Pierwsza porcja kodu działa dla słoika, ale znika, gdy uruchamiam się z poziomu zaćmienia (chyba że przeniesię pliki). Niestety, pakowanie zasobów wewnątrz słoika nie jest opcją, ponieważ użytkownik może potrzebować ich skonfigurować. – job

1

Oto moja próba odkrycia katalog, z którego słoik jest uruchomiony.

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); 
    } 
} 

Najpierw buduję "ścieżkę" obecnej klasy, zastępując "." przez "/", a następnie pobieram .class jako zasób. Metoda toString() zwraca coś takiego:

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

stamtąd swojej przeanalizować dany ciąg, aby pobrać katalog w którym znajduje się jar.

Powiązane problemy