7

プロパティ ファイルの読み取りと書き込みを行う単純なアプリケーションがあります。これは NetBeans で開発されたもので、NetBeans 内から実行すると問題なく動作します。ただし、ビルドしてデプロイしたところ、プロパティ ファイルが見つかりません。

プロジェクトの構造

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 ファイル内の構造を確認しましたが、すべてが期待どおりです。

誰かが私の間違いを指摘して、これを起動して実行するのを手伝ってもらえますか?

編集 - 一致するように名前を変更しました。それらは私のコードで常に一貫していました

4

4 に答える 4

3

おそらく、FileInputStream は、jar ファイル内にあるプロパティ「ファイル」を受け入れることができません。変更:

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ファイルから実行すると、「props/main.properties」は機能しますが、「/props/main.properties」は機能しません。

[rtb@rtblinux 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("===============================");
    }
}

[rtb@rtblinux props]$ cat props/main.properties 
x = This is the property value of x

[rtb@rtblinux 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)




[rtb@rtblinux 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%)

[rtb@rtblinux 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

[rtb@rtblinux props]$ cd /
[rtb@rtblinux /]$ 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)

あなたの状況には、あなたの成功を妨げている別の何かがあるに違いありません。

于 2013-01-11T21:41:59.507 に答える
3

あなたの質問は

conf/controller.properties

そしてあなたのコードはconf/runController.properties

編集: conf/*.properties が jar ファイル内にあると想定しています。その場合、ファイルに正しい名前が付けられていれば、コードは機能するはずです。

于 2013-01-11T20:35:31.907 に答える
2

を使用getResourceしてプロパティ ファイルを開くと、ファイルがクラスパスにあると見なされるため、プロパティ ファイルをクラスパスに配置する必要があります。別の方法として、conf ディレクトリをクラスパスに追加するか、プロパティ ファイルを移動して既存のクラスパスに配置します。

ファイルの場所をスラッシュで開始することで解決できる可能性があるため、クラスパスのルートからファイルの検索を開始することは間違いありません。それ以外の場合、検索パスは、コードが呼び出しを行っているクラスに関連しています (これが正しいかどうかはわかりません。それが Class.getResource で動作する方法ですが、Classloader.getResource は異なる場合があります)。

于 2013-01-11T20:29:52.517 に答える
1

助けてくれた皆さん、特にdashrbに感謝します。コードに1を加えてください。

皆様のお力添えで無事完成いたしました。この問題に対する最終的な解決策は、少し方針を変更することでした。

ファイルを読み書きする必要があったため (おそらく私の OP では明確ではありません)、Apache.commons.configuration の使用に切り替えました。

つまり、このスレッドのポインターにより、他のプロパティ ファイルが問題なく動作することが保証されました。

再度、感謝します

于 2013-01-14T19:56:38.257 に答える