2013-01-11 89 views
7

我有一個簡單的應用程序,它可以讀寫屬性文件。它是在NetBeans中開發的,當從Netbeans運行時工作得很好。但是,現在我已經構建並部署它,找不到屬性文件。爲什麼我的Java應用程序找不到我的屬性文件

項目結構

com/company/projectname/controller/controllerclass.java <- this is where the code using the properties file exists 

conf/runController.properties <- the properties file, this exists here 

在代碼中,我有以下訪問屬性文件:

private final String PROPERTIESFILELOCATION = "conf/runController.properties"; 

public void runController(){ 
this.runController = new Properties(); 
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION); 
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile()); 
this.runController.load(propsInput); 
} 

(概括爲簡潔起見)

當我從調用的jar文件命令行我問:

java -classpath /usr/java/projectdirectory/project.jar com.company.projectname.controller.controllerclass arg1 

因此,我已經設法在其他項目中以這種方式實現此目標,但由於某些原因,這不起作用。

我檢查了jar文件裏面的結構,並且所有的結果都在那裏。

任何人都可以指出我的錯誤,並幫助我解決這個問題嗎?

編輯 - 更改名稱以匹配。它們在我的代碼中始終保持一致

+0

* *裏面的jar文件,不爲'的conf/controller.properties'該文件存在,或爲'的conf/runController.properties',或者是一個不同的名稱(或不同的路徑內罐子)? – dashrb

+0

我確實更改了示例代碼,謝謝您的參考。它存在於conf/runController.properties的jar文件中。名稱在我的應用程序中都匹配 – nathj07

+0

如果將屬性更改爲'/ conf/runController.properties',那麼它肯定是相對於jar本身(而不是相對於jar中的.class文件的位置) – dashrb

回答

0

感謝大家的幫忙,尤其是dashrb,再加上1代碼

。由於我需要讀取和寫入文件(可能不清楚我的OP),我切換到了使用Apache.commons.configuration。

這就是說,在這個線程中的指針確實確保了我的其他屬性文件無障礙地工作。

再次感謝

2

如果使用getResource打開屬性文件,則假定該文件位於類路徑中,因此需要將該屬性文件放入類路徑中。替代方法是將conf目錄添加到類路徑中,或者移動屬性文件以使其位於現有的類路徑中。

有一點可能會幫助的是用起始斜槓來引用文件位置,所以毫無疑問,您希望從類路徑的根目錄開始搜索文件。否則,搜索路徑與您的代碼正在進行調用的類相關(不知道這是否正確;這就是它如何與Class.getResource一起使用,Classloader.getResource可能與此不同)。

+0

人們會希望屬性文件在jar文件中。我認爲Kal是對的 - 名字不一樣。 – dashrb

+0

@dashrb:這是一個很好的結果(來自我的+1),當然這個名字的差異並沒有幫助。當然,可能有超過1個錯誤。 –

+0

名稱差異只是我發佈的示例中的一個問題。我現在糾正了這一點,感謝您發現它。 – nathj07

3

你的問題談

的conf/controller.properties

和你的代碼談到conf/runController.properties

編輯:我假設的conf/*屬性在裏面。你的jar文件。如果是這種情況,那麼你的代碼應該工作,如果文件命名正確。

+0

是的,它在jar和它的名字相匹配。 – nathj07

3

也許FileInputStream不能遵守你的jar文件中的屬性「file」。更改:

this.runController = new Properties(); 
this.propertiesLocation = this.getClass().getClassLoader().getResource(this.PROPERTIESFILELOCATION); 
FileInputStream propsInput = new FileInputStream(this.propertiesLocation.getFile()); 
this.runController.load(propsInput); 

到:

this.runController = new Properties(); 
this.runController.load(this.getClass().getClassLoader().getResourceAsStream(this.PROPERTIESFILELOCATION)); 

編輯: 我創建了一個測試類,它表明,從文件系統或從JAR文件,即「道具/ main.properties運行時「作品但是」/道具/主要。屬性」不會:

[[email protected] props]$ cat org/dashrb/test/main.java 
package org.dashrb.test; 
import java.util.Properties; 
import java.io.IOException; 

public class main 
{ 
    public static void main(String args[]) 
    { 
     main myMain = new main(); 
     myMain.testProps("props/main.properties"); 
     myMain.testProps("/props/main.properties"); 
    } 

    public main() 
    { 
    } 

    public void testProps(String p) 
    { 
     try 
     { 
      System.out.println("==============================="); 
      Properties props = new Properties(); 
      System.out.println("Trying to load properties as " + p); 
      props.load(getClass().getClassLoader().getResourceAsStream(p)); 
      System.out.println("Loaded properties as " + p); 
      System.out.println("Property x is: " + props.getProperty("x")); 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
     System.out.println("==============================="); 
    } 
} 

[[email protected] props]$ cat props/main.properties 
x = This is the property value of x 

[[email protected] props]$ java -cp . org.dashrb.test.main 
=============================== 
Trying to load properties as props/main.properties 
Loaded properties as props/main.properties 
Property x is: This is the property value of x 
=============================== 
=============================== 
Trying to load properties as /props/main.properties 
Exception in thread "main" java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Properties.java:434) 
    at java.util.Properties.load0(Properties.java:353) 
    at java.util.Properties.load(Properties.java:341) 
    at org.dashrb.test.main.testProps(main.java:25) 
    at org.dashrb.test.main.main(main.java:11) 




[[email protected] props]$ jar cvf main.jar org props 
added manifest 
adding: org/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/test/(in = 0) (out= 0)(stored 0%) 
adding: org/dashrb/test/main.class(in = 1218) (out= 679)(deflated 44%) 
adding: org/dashrb/test/main.java(in = 594) (out= 287)(deflated 51%) 
adding: props/(in = 0) (out= 0)(stored 0%) 
adding: props/main.properties(in = 36) (out= 36)(deflated 0%) 

[[email protected] props]$ jar tvf main.jar 
    0 Fri Jan 11 17:29:40 EST 2013 META-INF/ 
    68 Fri Jan 11 17:29:40 EST 2013 META-INF/MANIFEST.MF 
    0 Fri Jan 11 17:26:00 EST 2013 org/ 
    0 Fri Jan 11 17:26:00 EST 2013 org/dashrb/ 
    0 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/ 
    1218 Fri Jan 11 17:28:52 EST 2013 org/dashrb/test/main.class 
    594 Fri Jan 11 17:29:24 EST 2013 org/dashrb/test/main.java 
    0 Fri Jan 11 17:26:40 EST 2013 props/ 
    36 Fri Jan 11 17:26:40 EST 2013 props/main.properties 

[[email protected] props]$ cd/
[[email protected] /]$ java -cp ~/misc/src/java/props/main.jar org.dashrb.test.main 
=============================== 
Trying to load properties as props/main.properties 
Loaded properties as props/main.properties 
Property x is: This is the property value of x 
=============================== 
=============================== 
Trying to load properties as /props/main.properties 
Exception in thread "main" java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Properties.java:434) 
    at java.util.Properties.load0(Properties.java:353) 
    at java.util.Properties.load(Properties.java:341) 
    at org.dashrb.test.main.testProps(main.java:25) 
    at org.dashrb.test.main.main(main.java:11) 

一定有什麼東西在你的情況這是防止你的成功不同

+0

我試着讓我得到空指針conf/runController.properties或/conf/runController.properties我得到null指針上java.util.Properties $ LineReader.readLine這是阿拉liltte莫名其妙,因爲我從來沒有這樣的問題 – nathj07

+0

之前我知道你已經看過名字了。你能證實大寫字母嗎?如果你在Windows上,磁盤上的文件名不區分大小寫,但(我相信)jar文件的內容是。 – dashrb

+0

當然。大寫是正確和一致的。該文件被稱爲runController.properties,並被稱爲這樣。 – nathj07

相關問題