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

你的问题谈到

conf/controller.properties

你的代码谈论conf/runController.properties

编辑:我假设 conf/*.properties 在你的 jar 文件中。如果是这种情况,那么如果文件命名正确,您的代码应该可以工作。

于 2013-01-11T20:35:31.907 回答
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 回答
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 回答