我正在尝试在 Spring 中制作我的第一个 bean,但在加载上下文时遇到了问题。我在 src/main/resources 中有一个 bean 的配置 XML 文件。
我收到以下 IOException:
线程“main”中的异常 org.springframework.beans.factory.BeanDefinitionStoreException:IOException 从类路径资源 [src/main/resources/beans.xml] 解析 XML 文档;嵌套异常是
java.io.FileNotFoundException: 类路径资源 [src/main/resources/beans.xml] 无法打开,因为它不存在
但我不明白,因为我做了以下代码测试:
File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());
这给了我真实的! resources
在类路径中。怎么了?
原文由 dawrutowicz 发布,翻译遵循 CC BY-SA 4.0 许可协议
谢谢,但这不是解决方案。我发现它为什么不适合我。
因为我做了一个声明:
当 beans.xml 文件存在时,我想我会参考项目的根目录。然后我将配置文件放入 src/main/resources 并将初始化更改为:
它仍然是一个 IO 异常。
然后文件留在 src/main/resources/ 但我将声明更改为:
它解决了问题-也许对某人有帮助。
谢谢和欢呼!
编辑:
由于我得到了很多人对这个解决方案的赞许,并且几年前我作为学生第一次体验了 Spring,所以我很想尽快解释一下它为什么有效。
当项目被编译和打包时,项目中’src/main/java’中的所有文件和子目录都进入打包jar(我们要创建的工件)的根目录。同样的规则适用于“src/main/resources”。
在构建项目的过程中,这是许多工具(如 maven 或 sbt)所遵循的约定(注意:作为默认配置!)。当代码(来自帖子)处于运行模式时,它找不到像“src/main/resources/beans.xml”这样的东西,因为 beans.xml 在 jar 的根目录中(复制到 /beans .xml 在创建的 jar/ear/war 中)。
使用 ClassPathXmlApplicationContext 时,bean xml 定义的正确位置声明在这种情况下是“/beans.xml”,因为这是它属于 jar 的路径,后来属于类路径。
可以通过使用归档程序(即 rar)解压缩 jar 并查看其目录结构的内容来验证它。
我建议阅读有关类路径的文章作为补充。