2011-06-22 32 views
8

我創建了一個應用程序,該應用程序是一個可運行的jar(使用maven-assembly插件),並帶有幾個用戶可配置資源,它們位於同一目錄(圖像,屬性,等等)運行Jar時的當前工作目錄

當從命令行運行jar與java -jar ...當前目錄是你所期望的。問題是,在某些操作系統(Ubuntu 11.04)中,如果通過簡單地雙擊該jar來啓動應用程序,則當前工作目錄是主目錄。

是否有獲取jar所在當前目錄的首選方法,或者訪問與jar並排放置的外部資源的其他方法?

回答

11

您可以使用MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()來獲取jar文件的位置。

另一種替代方法是將其他只讀資源打包在相關類中的jar文件中,以便您可以使用Class.getResource(String)Class.getResourceAsStream(String)獲取與給定類相關的資源。

例如,你可能有一類com.example.icons.Icons和圖標將在COM /例子/ MYAPP /圖標/路徑被打包一起Icons.class。假設你的「打開」按鈕使用的圖標命名open.png

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

第一部分代碼適用於jar,但是當我在eclipse中運行時(除非我移動文件),它會中斷。不幸的是,將資源打包到jar中並不是一種選擇,因爲用戶可能需要配置它們。 – job

1

這裏我試圖發現從一個罐子運行所在目錄。

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

首先我通過替換「。」來構建當前類的「路徑」。通過「/」,然後我檢索.class作爲資源。的toString()方法返回類似:

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

從那裏您解析給定的字符串來檢索目錄中的jar。