我试图在Spring中创建我的第一个bean但是在加载上下文时遇到了问题 . 我在src / main / resources中有一个bean的配置XML文件 .
我收到以下IOException:
线程“main”中的异常org.springframework.beans.factory.BeanDefinitionStoreException:从类路径资源[src / main / resources / beans.xml]解析XML文档的IOException;嵌套异常是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
在类路径中 . 怎么了?
13 回答
请注意,第一个applicationContext作为
web.xml
的一部分加载;这是下面提到的 .下面的代码也会尝试再创建一个applicationContext .
请参阅
beans.xml
和applicationContext.xml
之间的difference如果
<META-INF/spring/>
下的appliationContext.xml
已使用<import resource="beans.xml"/>
声明,那么appliationContext.xml
正在appliationContext.xml
的META-INF/spring
的同一位置beans.xml
下加载beans.xml
.在哪里;在代码中;如果它被声明如下
这是在
WEB-INF/classes
或者eclipsesrc/main/resources
中查看beans.xml .[如果您在
src/main/resources
添加了beans.xml
,那么在创建WAR时它可能会被置于WEB-INF/classes
. ]所以完全查找 TWO 文件 .
我通过在
applicationContext.xml
导入时添加类路径查找解决了这个问题,如下所示并删除了java代码中的
ClassPathXmlApplicationContext("beans.xml")
行,这样只会加载一个ApplicationContext .谢谢,但那不是解决方案 . 我发现它为什么不适合我 .
自从我做了一个宣言:
当bean.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中以及稍后在classpath中的路径 .
可以通过使用归档器(即rar)解压缩jar来验证它,并使用目录结构查看其内容 .
我建议阅读有关classpath的文章作为补充 .
用它
ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");
这对我有用:
我怀疑你're building a .war/.jar and consequently it'不再是一个文件,而是该包中的资源 . 请尝试使用ClassLoader.getResourceAsStream(String path) .
我做了与大多数人相反的事情 . 我正在使用Force IDE Luna Java EE,并将我的Beans.xml文件放在包中;但是,我在Beans.xml字符串之前 - 对于ClassPathXMLApplicationContext参数 - 使用相对路径 . 所以在我的主应用程序 - 访问Beans.xml文件的应用程序 - 我有:
我还注意到,只要我将Beans.xml文件从src文件夹移动到包中,就会在XML文件图标左下方有一个Bean图像,当该xml文件位于包外时,该图像不存在 . 这是一个很好的指示,让我知道现在可以通过ClassPathXMLAppllicationsContext访问beans xml文件 .
src/main/resources
是源目录,不应直接引用它 . 在构建/打包项目时,内容将被复制到类路径的正确位置 . 然后你应该像这样加载它或者像这样
试试这个:
new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");
file: preffix指向文件系统资源,而不是classpath .
文件路径可以是相对的还是系统的(/ home / user / Work / src ...)
在Spring中,所有源文件都在src / main / java中 . 同样,资源通常保存在src / main / resources中 . 因此,请将spring配置文件保存在resources文件夹中 .
确保在src / main / resources中也有文件的ClassPath条目 .
在.classpath中检查以下2行 . 如果他们失踪了添加它们 .
所以,如果你有一切就绪,下面的代码应该工作 .
ApplicationContext ctx = new ClassPathXmlApplicationContext(“Spring-Module.xml”);
这是因为applicationContect.xml或any_filename.XML未放在正确的路径下 .
Trouble shooting Steps
1:在资源文件夹下添加XML文件 .
2:如果您没有资源文件夹 . 通过右键单击项目new> Source Folder创建一个,将其命名为 resource 并将XML文件放在其下 .
我也遇到了类似的问题,但因为有点不同的原因所以在这里分享,以防它可以帮助任何人 .
My file location
How I was using
ClassPathXmlApplicationContext("beans.xml");
There are two solutions
将beans.xml从包中取出并放入默认包中 .
使用时指定包名称即可 .
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
你看过src目录 . xml文件确实存在于那里 . 但请查看设置所有输出类的class或bin / build目录 . 我怀疑你只需要资源/ beans.xml路径来使用 .
如果这个问题仍然让你感到困惑,并且你正在使用Eclipse进行开发,请查看这个Eclipse错误:Resources files from "src/main/resources" are not correctly included in classpath
解决方案似乎是查看项目属性,Java构建路径,源文件夹 . 删除
/src/main/resources
目录并重新添加 . 这会导致提醒Eclipse需要将这些文件复制到类路径中 .当使用Eclipse的“Neon”版本时,这个bug影响了我 . (直到我意识到刚刚描述的简单修复之前,我感到非常沮丧)