2016-02-29 45 views
0

後,我一直認爲我是用antBuild建立一個單一的安裝程序.exe文件打包JavaFX應用程序,我的應用程序有一個是這樣,我加載放置在項目的根一些配置文件他們從項目,以便根到他們可以.jar文件旁邊的地方,可能是多變的:JavaFX的:可編輯配置文件包裝

 try { 
     File base = null; 
     try { 
      base = new File(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI()) 
        .getParentFile(); 
     } catch (URISyntaxException e) { 
      System.exit(0); 
     } 
     try { 
      File configFile = new File(base, "config.properties"); 
     } 

這樣包裝的應用程序,即使我手動將文件放在同一個地方用jar文件後,該應用程序再次無法識別它們並且發生錯誤。


那麼什麼是存儲在哪裏存儲某種配置文件,以及如何將它們添加到安裝程序在安裝過程中把它放到正確的地方正確的方式?

回答

2

如果您的應用程序打包爲一個jar文件,然後MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI()會返回一個jar:方案URI。 constructor for File taking a URI假設它獲得file: scheme URI,這就是您在這裏遇到錯誤的原因。 (基本上,如果你的應用程序打包爲一個jar文件中,資源config.properties不是一個文件,同時,其在存檔文件中的一個條目。)還有基本上沒有(可靠)的方式來更新JAR文件捆綁的內容應用程序。

我通常處理這個問題的方法是捆綁缺省配置文件到jar文件,並定義用於存儲可編輯的配置文件中的用戶的文件系統上的路徑。通常這將相對於用戶的主目錄:

Path configLocation = Paths.get(System.getProperty("user.home"), ".applicationName", "config.properties"); 

或類似的東西。

然後在啓動時,你可以這樣做:

if (! Files.exists(configLocation)) { 
    // create directory if needed 
    if (! Files.exists(configLocation.getParent())) { 
     Files.createDirectory(configLocation.getParent()); 
    } 

    // extract default config from jar and copy to config location: 

    try (
     BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.properties"))); 
     BufferedWriter out = Files.newBufferedWriter(configLocation);) { 

     in.lines().forEach(line -> { 
      out.append(line); 
      out.newLine(); 
     }); 
    } catch (IOException exc) { 
     // handle exception, e.g. log and warn user config could not be created 
    } 
} 

Properties config = new Properties(); 
try (BufferedReader in = Files.newBufferedReader(configLocation)) { 
    config.load(in); 
} catch (IOException exc) { 
    // handle exception... 
} 

所以這個檢查是否配置文件已經存在。如果不是,它會從jar文件中提取默認配置並將其內容複製到定義的位置。然後它從定義的位置加載配置。因此,用戶第一次運行應用程序時,它使用默認配置。之後,用戶可以編輯配置文件,隨後它將使用編輯後的版本。如果你喜歡,你當然可以創建一個UI來修改內容。這樣做的一個好處是,如果用戶做了一些事情來使配置不可讀,他們可以簡單地刪除它,並且默認將被再次使用。

很明顯,這可以防止異常更好一些(例如,處理由於某種原因導致目錄不可寫入的情況,使配置文件位置可由用戶定義等等),但這是我在這些場景中使用的基本結構。

+0

你會如何處理應用程序的更新?刪除舊的或合併配置? – Inge

+1

本質上我們合併它們。在我們的應用程序中,「加載屬性」步驟比我在此處顯示的要複雜得多。如果文件不存在,則每個單獨的屬性都會分配一個默認值。在程序退出時,我們明確寫出了屬性,包括默認值。 (我們也有在大多數的應用程序的GUI配置屏幕,這樣的配置可以在運行時更改。)所以,如果一個新版本引入了新的配置屬性,它透明地從舊的配置獲得它的缺省值文件它第一次運行。 –

+0

信息的好解決方案 – Inge