首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么/src/main/resources下的文件在执行时不可读?

为什么/src/main/resources下的文件在执行时不可读?
EN

Stack Overflow用户
提问于 2011-12-30 23:30:24
回答 4查看 3K关注 0票数 2

我有一个Java项目,并使用标准的maven原型来创建dir结构。它看起来是这样的:

代码语言:javascript
复制
|-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文件是不应该位于资源文件夹中,还是必须使用其他方法加载它?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-30 23:45:22

前面的两个答案是正确的,但我想给出更多的上下文。

此文件位于两个位置。它开始于/src/main/resources,当您构建项目时,Maven会将其复制到/target/classes。

在运行时,您不应该访问源代码中的副本。否则,您的软件将需要访问源代码才能运行。相反,您应该访问可交付内容中的副本。在执行时,您可以放心地假设您将在类路径中找到它。它与您编译的类位于同一位置,因此如果它不在类路径中,您将无法在第一时间运行该程序。这就是为什么你应该像其他回答者提到的那样使用getResourceAsStream()

(尽管对于生产软件,我建议使用Spring的资源抽象来访问这类东西。)

票数 5
EN

Stack Overflow用户

发布于 2011-12-30 23:35:53

使用

代码语言:javascript
复制
YourClass.class.getResourceAsStream("/filename.properties");
票数 4
EN

Stack Overflow用户

发布于 2011-12-30 23:49:39

为了扩展已经给出的两个答案,在构建Maven项目时,src/main/resources中的文件被复制到类路径根目录下的JAR中。如果您创建了jar tvf *yourjarname*,您会注意到其中既没有src/main/java文件夹,也没有src/main/resources文件夹。因此,当您通过JAR运行时,尝试手动读取这些(现在不存在的)路径将会失败。其他两个答案都有很好的建议,请使用getResourceAsStream方法读取您的文件。甚至在Properties对象上有一个方法,可以让这一切变得非常方便和易于使用:

代码语言:javascript
复制
     URL resourceURL = Thread.currentThread().getContextClassLoader()
           .getResource(yourpropertyfilename);

     Properties props = new Properties();
     props.load(resourceURL.openStream());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8681053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档