2013-01-11 2 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ファイルを呼び出すとコマンドラインI発行:

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

これまで他のプロジェクトでこれを達成してきましたが、何らかの理由でこれが機能していません。

私はjarファイル内の構造をチェックしており、すべてがそこに期待通りです。

誰でも私の間違いを指摘し、これを手に入れて実行してください。

EDIT-名前が一致するように変更しました。

+0

* jarファイル*内部では、ファイルは 'のconf/controller.properties'として、または' confに/ runController.properties'として存在しない、またはそれは別の名前(または内部に別のパスであります瓶)? – dashrb

+0

サンプルコードを変更しました。ありがとうございました。 jarファイルのconf/runController.propertiesに存在します。アプリケーション内のすべての名前が一致する – 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ファイル内にあることを期待しています。私はカルが正しいと思う - 名前は同じではない。 – dashrb

+0

@dashrb:それは良いキャッチ(私の+1)でしたが、確かに名前の不一致は問題を助けません。もちろん、1つ以上のものが間違っているかもしれません。 –

+0

名前の不一致は、私が掲示した例の単なる問題に過ぎません。私は今、それを見つけていただきありがとうございます。 – nathj07

3

あなたの質問を約conf/runController.properties

EDITを語っについて

のconf/controller.properties

とあなたのコードを語る:私はconfに/ *プロパティが内部であると仮定していますあなたのjarファイルその場合、ファイルの名前が正しく指定されていれば、コードが正しく動作するはずです。

+0

ええ、その瓶と名前が一致します。 – 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)); 

EDIT: 私はテストクラスを作成し、それがファイルシステムからOR JARファイルから実行しているときことを示し、「小道具/ main.propertiesつまり、あなたが変更します"作品"/props/main。プロパティがない」:

[[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のNULLポインタ、または/conf/runController.propertiesのいずれかを取得しようとしました。java.util.Properties $ LineReader.readLineのnullポインタを取得しました。これは、以前は – nathj07

+0

の名前を見てきました。大文字を確認できますか?あなたがWindows上にいる場合、ディスク上のファイル名は大文字と小文字は区別されませんが、jarファイルの内容は(私は)信じています。 – dashrb

+0

確かに。大文字は正確で一貫しています。このファイルはrunController.propertiesと呼ばれ、そのように呼ばれます。 – nathj07

関連する問題