我有一个Eclipse项目,具有以下目录结构:
MyProj
>> src/main/java
>> src/main/config
>> src/test/java
>> src/test/config
在src/test/config
中,我有一个名为app.properties
的属性文件,其中包含src/main/java
和src/test/java
中的类都使用的属性。
我用来查找属性文件的所有代码如下所示:
try {
Properties props = new Properties();
props.load(new FileInputStream("app.properties"));
someString = props.getProperty("app.title.color");
// etc.
} catch(Exception exc) {
// Handle exception...
}
然而,当我运行此程序时,我会收到以下错误(在上面的catch
子句中处理):
java.io.FileNotFoundException:app.properties(系统找不到指定的文件)
但是,当我将app.properties
文件移动到我的项目根目录(与src/main/java
处于同一级别)并重新运行代码时,它的工作效果非常好。
显然,这是一个类路径问题。如果我转到Build Path >> Configure Build Path >> Source
,我会发现src/test/config
实际上是构建路径上的源文件夹。这可能并不意味着它也在类路径上!!!
我如何配置Eclipse在类路径上查找src/test/config
,以便我可以将属性文件放在那里,但在运行时(当我运行单元测试时)仍然可以使用它
提前感谢!
正确的方法(这将确保您的代码在放入JAR时继续工作)是将src/test/config
添加到项目的类路径中,并使用ClassLoader
的getResourceAsStream()
方法加载资源。例如
Thread.currentThread().getContextClassLoader().getResourceAsStream("app.properties")
这并不完全是类路径问题(因为您没有在这里加载类!)-问题是您的代码加载的文件相对于当前工作目录,默认情况下,当前工作目录是您的项目根目录。FileInputStream不知道类路径是什么——它只是加载文件!
您可以指定文件的路径:
props.load(new FileInputStream("src/test/config/app.properties"));
尽管最好在命令行(或Eclipse运行配置文件)上将config目录指定为系统属性:
-Dconfig.dir="src/test/config/"
然后加载与该目录相关的文件,类似于:
public static final String CONFIG_DIR = System.getProperty("config.dir");
props.load(new FileInputStream(CONFIG_DIR+"app.properties"));
文件夹被合并,但您必须以不同的方式访问属性文件,作为相对于类的资源:
InputStream is = YourClassName.class.getResourceAsStream("/app.properties");
注意前面的"/"。