2015-05-28 51 views
1

快速之一。我試圖部署一個程序,它在以下代碼中生效。我想讀取一個名爲,properties的屬性文件。的Java - 運行JAR拒絕加載文件在同一目錄

Properties props = new Properties(); 
InputStream is; 
// First try - loading from the current directory 
try { 
    File f = new File("properties"); 
    is = new FileInputStream(f); 
} catch (FileNotFoundException fnfe) { 
    fnfe.printStackTrace(System.err); 
    is = null; 
} 
try { 
    if (is == null) { 
     // Try loading from classpath 
     is = getClass().getResourceAsStream("properties"); 
    } 
    //Load properties from the file (if found), else crash and burn. 
    props.load(is); 
} catch (IOException e) { 
    e.printStackTrace(System.err); 
} 

當我通過Netbeans運行程序時,一切順利。

當我單獨運行JAR時,雖然有,但我得到兩個例外。

java.io.FileNotFoundException: properties (The system cannot find the file specified) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(Unknown Source) 
     . 
     . 
     .   
Exception in Application start method 
Exception in Application stop method 
java.lang.reflect.InvocationTargetException 
     . 
     . 
     . 
     (exception during props.load(is) because is == null) 

我從「dist」文件夾運行文件。我已經嘗試將屬性文件放在jar文件夾內,沒有結果。通常,properties文件位於根項目文件夾中。

任何想法?

+0

嘗試使用絕對路徑到文件。當您從類路徑請求文件時,請確保該文件確實位於類路徑中,可以使用java VM選項的「-cp/some/dir」。還請嘗試使用前導斜槓字符,以便請求的資源具有絕對路徑,如「/ properties」。如果您仍然有問題,可以確認您正在使用的平臺以及Java VM啓動選項和命令行。 –

+0

它應該在您運行'java'命令的目錄中。否則,它正在看Jar本身,這是你的第二個'嘗試'。你期望它能在文件系統或jar中找到它嗎? – RealSkeptic

+0

如果你想讀相對於當前目錄中的文件,該文件必須是在你的,不一定是罐子在目錄中運行該命令的目錄 –

回答

2

你讀文件作爲資源(getResourceAsStream("properties");)。所以它必須在類路徑中。也許在jar或直接添加到類路徑的目錄中。

罈子是一個zip文件,這樣就可以用7zip的打開它,例如添加屬性文件的罐子根級別,然後重試。

+0

此。當你使用'getResourceAsStream'和相關方法時,你需要確保資源加載器能夠找到它;即它必須位於classpath中。除了手動將資源添加到JAR本身之外,還有一些方法可以指定將資源文件包含在用於構建JAR的任何內容中(但我在Netbeans中不知道它們)。 –

+0

爲生產目的手動添加資源是不行的。我只建議一個快速的方法來檢查它是否有效。 –

+0

好吧,Netbeans似乎應該自動將資源文件打包到JAR中,只要它們位於源文件夾內的類路徑中。我知道Eclipse有一些選項可以禁用這個選項,或者用構建腳本忽略非Java文件,但我不知道Netbeans中是否存在相同的麻煩。 –

0

多虧了意見,我建立了基於罐子的當前運行目錄的絕對路徑生成。道具給你,夥計們。

private String relativizer(String file) { 
    URL url = RobotikosAnomologitos.class.getProtectionDomain().getCodeSource().getLocation(); 
    String urlString = url.toString(); 
    int firstSlash = urlString.indexOf("/"); 
    int targetSlash = urlString.lastIndexOf("/", urlString.length() - 2) + 1; 

    return urlString.substring(firstSlash, targetSlash) + file; 
} 

所以我的新文件閱讀結構爲:

 Properties props = new Properties(); 
     InputStream is; 
     // First try - loading from the current directory 
     try { 
      File f = new File("properties"); 
      is = new FileInputStream(f); 
     } catch (FileNotFoundException fnfe) { 
      fnfe.printStackTrace(System.err); 
      is = null; 
     } 
     try { 
      if (is == null) { 
       // Try loading from classpath 
       String pathToProps = relativizer("properties");  
       is = new FileInputStream(new File(pathToProps)); 
       //is = getClass().getResourceAsStream(pathToProps); 
      } 
      //Load properties from the file (if found), else crash and burn. 
      props.load(is); 
     } catch (IOException e) { 
      e.printStackTrace(System.err); 
     } 
     // Finally parse the properties. 
     //code here, bla bla 
+0

這將工作,但您沒有從類路徑加載道具文件,只能從jar所在的目錄加載。在源代碼中,您可以從類路徑中讀取它。但是,您必須將類路徑配置到文件所在的目錄,或者將文件放入jar文件中。 –

相關問題