我有一个Java项目,并使用标准的maven原型来创建dir结构。它看起来是这样的:
|-src/main/java
|-src/main/resources
|-target/classes
|- ... 现在,我的一个类使用.properties文件来读取一些设置。我将它放在src/main/resources中,并通过File propertiesFile = new File("./src/main/resources/starter.properties");读取它。
当我使用eclipse运行配置时,一切工作正常。但是最近我尝试使用java some.package.Class从我的控制台启动相同的Java-class,因为.class-file位于目标/类中,所以我收到消息./src/main/resources/starter.properties找不到。
我做错了什么?.properties文件是不应该位于资源文件夹中,还是必须使用其他方法加载它?
发布于 2011-12-30 23:45:22
前面的两个答案是正确的,但我想给出更多的上下文。
此文件位于两个位置。它开始于/src/main/resources,当您构建项目时,Maven会将其复制到/target/classes。
在运行时,您不应该访问源代码中的副本。否则,您的软件将需要访问源代码才能运行。相反,您应该访问可交付内容中的副本。在执行时,您可以放心地假设您将在类路径中找到它。它与您编译的类位于同一位置,因此如果它不在类路径中,您将无法在第一时间运行该程序。这就是为什么你应该像其他回答者提到的那样使用getResourceAsStream()。
(尽管对于生产软件,我建议使用Spring的资源抽象来访问这类东西。)
发布于 2011-12-30 23:35:53
使用
YourClass.class.getResourceAsStream("/filename.properties");发布于 2011-12-30 23:49:39
为了扩展已经给出的两个答案,在构建Maven项目时,src/main/resources中的文件被复制到类路径根目录下的JAR中。如果您创建了jar tvf *yourjarname*,您会注意到其中既没有src/main/java文件夹,也没有src/main/resources文件夹。因此,当您通过JAR运行时,尝试手动读取这些(现在不存在的)路径将会失败。其他两个答案都有很好的建议,请使用getResourceAsStream方法读取您的文件。甚至在Properties对象上有一个方法,可以让这一切变得非常方便和易于使用:
URL resourceURL = Thread.currentThread().getContextClassLoader()
.getResource(yourpropertyfilename);
Properties props = new Properties();
props.load(resourceURL.openStream());https://stackoverflow.com/questions/8681053
复制相似问题