2013-04-03 52 views
0

這裏是我的Maven的結構:可執行的JAR找不到資源

project 
    ---src 
    ----main 
     ----java 
      ----App.java 
     ----resources 
      ----config.properties 

這裏讀config.properties代碼:

private static final URL propFile = ClassLoader.getSystemResource("config.properties"); 

public App() throws IOException { 
    props.load(new FileInputStream(propFile.getFile())); 
} 

public static void main(String[] args) { 
    try { 
     App app = new App(); 
     //Something interesting happens here 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

當我運行java -jar MyApp-1.0.jar,我收到FileNotFoundException

java.io.FileNotFoundException:file:/home/dragon/JavaProjects/MyApp/target/MyApp-1.0.jar!/config.pr operties(沒有這樣的文件或目錄)

它有什麼問題?

回答

1

無論這些應該只是罰款:

Properties props = new Properties(); 
props.load(Thread.currentThread().getContextClassLoader() 
     .getResourceAsStream("config.properties")); 
// OR 
props.load(ClassLoader.getSystemResourceAsStream("config.properties"); 

在你的榜樣,那麼你可以使用此代碼獲取屬性文件,您正嘗試通過FileInputStream來訪問JAR歸檔中嵌入的文件,這是您無法直接執行的。

+0

是的,這個效果很好。 但我不明白爲什麼Java不看我的基礎變體中的類文件夾。 – Dragon

+0

@Dragon - 見編輯。您的應用程序已JAR,因此您將無法使用文件輸出流來檢索嵌入的資源。你可能只是問,而不是downvoting。 – Perception

+0

現在我明白了。謝謝。 – Dragon

1

在你的java文件夾中,你應該放置App.java和資源目錄。

private static final URL propFile = getClass().getResourceAsStream("resources/config.properties"); 

public App() throws IOException { 
    props.load(new FileInputStream(propFile.getFile())); 
} 

所以,你的項目結構看起來像:

project 
    ---src 
    ----main 
     ----java 
      ----App.java 
      ----resources 
       ----config.properties 
+0

getClass不能從靜態上下文中引用。然後接收到'NullPointerException'。 – Dragon

+0

你能發佈完整的代碼嗎? (也要避免NullPointerException,你應該在加載道具之前檢查它是否爲空 - if(propFile!= null)然後加載它)。 –

+0

根據標準的maven目錄佈局,我有正確的項目結構。 (編輯主題提供更多的代碼)。 – Dragon