无法从资源目录加载属性文件

art*_*rxe 55 java eclipse maven-3 maven

我从Git存储库导入了一个项目,并在Eclipse中添加了Maven性质.在resources文件夹中,我添加了一个名为的配置文件myconf.properties.现在,每当我尝试从我的Java代码中打开这个文件时,我都会得到FileNotFoundException.该文件也存在于target/classesmaven编译项目后生成的文件夹中.

谁能告诉我可能是什么问题?我试图加载此文件的Java代码是:

props.load(new FileInputStream("myconf.properties"));
Run Code Online (Sandbox Code Playgroud)

在哪里props是一个Properties对象.

谁能给我一些关于如何解决这个问题的提示?

See*_*ose 118

如果在编译之后将文件放在目标/类下,则它已经位于构建路径的一部分目录中.目录src/main/resources是此类资源的Maven默认目录,它由Eclipse Maven插件(M2E)自动放置到构建路径.因此,无需移动属性文件.

另一个主题是,如何检索这些资源.构建路径中的资源自动位于正在运行的Java程序的类路径中.考虑到这一点,您应该始终使用类加载器加载此类资源.示例代码:

String resourceName = "myconf.properties"; // could also be a constant
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties props = new Properties();
try(InputStream resourceStream = loader.getResourceAsStream(resourceName)) {
    props.load(resourceStream);
}
// use props here ...
Run Code Online (Sandbox Code Playgroud)

  • @ k-den我使用[try-with-resources语句](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) - 你是对的 - 是Java 7的功能(然后).但是,它可以替换为适用于旧Java版本的典型try-finally块. (3认同)

dev*_*v2d 15

我认为你需要把它放下src/main/resources并加载如下:

props.load(new FileInputStream("src/main/resources/myconf.properties"));
Run Code Online (Sandbox Code Playgroud)

您尝试加载它的方式将首先检查项目的基本文件夹.如果它在target/classes,你想从那里加载它执行以下操作:

props.load(new FileInputStream("target/classes/myconf.properties"));
Run Code Online (Sandbox Code Playgroud)

  • 那样不行.随着应用程序的编译,这些补丁不再存在.要从类路径获取资源,您需要使用类加载器.你需要使用类似ResourceBundle.getBundle("myconf.properties")的东西 (3认同)

rns*_*rns 7

如果它是简单的应用程序,那么也可以使用getSystemResourceAsStream.

try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("config.properties"))..
Run Code Online (Sandbox Code Playgroud)

  • "简单应用程序"是什么意思?在"复杂应用程序"中使用解决方案的后果是什么? (3认同)

Kev*_*sox 5

右键单击该Resources文件夹并选择Build Path > Add to Build Path