Spring确实存在时,找不到bean xmlconfiguration文件
我正在尝试在Spring中创build第一个bean,但加载上下文时遇到了问题。 我在src / main / resources中有一个bean的configurationXML文件。
我收到以下IOException:
exception在线程“主”org.springframework.beans.factory.BeanDefinitionStoreException:IOException从类path资源parsingXML文档[src / main / resources / beans.xml]; 嵌套的exception是
java.io.FileNotFoundException:无法打开类path资源[src / main / resources / beans.xml],因为它不存在
但我不明白,因为我做了下面的代码testing:
File f = new File("src/main/resources/beans.xml"); System.out.println("Exist test: " + f.exists());
这让我真实! resources
在类path中。 怎么了?
谢谢,但那不是解决办法。 我发现它为什么不适合我。
由于我做了一个声明:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
我以为当beans.xml文件在那里时,我会引用项目的根目录。 然后我把configuration文件放到src / main / resources中,把初始化改成:
ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");
它仍然是一个IOexception。
然后该文件被留在src / main / resources /中,但我将声明更改为:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
它解决了这个问题 – 也许这对别人有帮助。
感谢和欢呼!
编辑:
由于我得到了很多人的赞同,并且几年前和Spring一起学习了Spring,所以我觉得很快就会解释为什么它会起作用。
当项目正在被编译和打包时,项目中所有的src / main / java文件和子目录都会转到打包jar(我们要创build的工件)的根目录下。 同样的规则适用于'src / main / resources'。
这是一个在构build项目过程中被诸如maven或sbt等许多工具所尊重的约定(注意:作为默认configuration!)。 当代码(来自post)处于运行模式时,由于beans.xml位于jar的根目录(复制到/ beans),所以找不到“src / main / resources / beans.xml” .xml创build的jar / ear / war)。
在使用ClassPathXmlApplicationContext时,在这种情况下,适用于bean xml定义的位置声明是“/beans.xml”,因为这是它在jar中的path,后来在classpath中。
它可以通过解压一个jar包与一个存档(即rar),并看到它的内容与目录结构进行validation。
我会推荐阅读关于classpath的文章作为补充。
尝试这个:
new ClassPathXmlApplicationContext(" file: src/main/resources/beans.xml");
文件: preffix指向文件系统资源,而不是classpath。
文件path可以是相对的或系统的(/ home / user / Work / src …)
我也有一个类似的问题,但由于有点不同的原因,所以在这里分享,以防万一它可以帮助任何人。
我的文件位置
我是怎么用的
ClassPathXmlApplicationContext("beans.xml");
有两个解决scheme
- 将beans.xml从包中取出并放入默认包中。
- 在使用时指定包名,
ClassPathXmlApplicationContext("com/mypackage/beans.xml");
使用它ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");
我怀疑你正在构build一个.war / .jar,因此它不再是一个文件,而是该包中的一个资源。 尝试使用ClassLoader.getResourceAsStream(String path) 。
src/main/resources
是一个源代码目录,你不应该直接引用它。 在构build/打包项目时,内容将被复制到类path的正确位置。 你应该像这样加载它
new ClassPathXmlApplicationContext("beans.xml")
或者像这样
new GenericXmlApplicationContext("classpath:beans.xml");
你已经看过了src目录。 xml文件确实存在于那里。 但是看看所有你的输出类都设置的类或bin / build目录。 我怀疑你只需要resources / beans.xmlpath来使用。
请注意,第一个applicationContext作为web.xml
一部分加载; 这是与下面提到的。
<context-param> <param-name>contextConfigLocation</param-name> <param-value>META-INF/spring/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>myOwn-controller</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>META-INF/spring/applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
下面的代码也将尝试创build一个更多的applicationContext。
private static final ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
查看beans.xml
和applicationContext.xml
的区别
如果<META-INF/spring/>
下的<META-INF/spring/>
已经用<import resource="beans.xml"/>
那么这个appliationContext.xml
正在加载相同位置下的beans.xml
META-INF/spring
appliationContext.xml
。
作为; 在代码中; 如果它宣布如下
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
这是在WEB-INF/classes
或eclipse src/main/resources
查找beans.xml。
[如果您在src/main/resources
添加了beans.xml
,则在创buildWAR时可能会将其放置在WEB-INF/classes
。]
所以完全查找了两个文件。
我通过添加类path查找来解决这个问题,同时在applicationContext.xml
导入,如下所示
<import resource="classpath*:beans.xml" />
并在java代码中删除了行ClassPathXmlApplicationContext("beans.xml")
,这样只会加载一个ApplicationContext。
在Spring中,所有的源文件都在src / main / java里面。 同样,资源通常保存在src / main / resources中。 所以,把你的springconfiguration文件保存在resources文件夹中。
确保你在src / main / resources里面有你的文件的ClassPath条目。
在.classpath中检查以下两行。 如果他们缺less添加它们。
<classpathentry path="src/main/java" kind="src"/> <classpathentry path="src/main/resources" kind="src" />
所以,如果你有一切就位,下面的代码应该工作。
ApplicationContext ctx = new ClassPathXmlApplicationContext(“Spring-Module.xml”);
我做了最相反的。 我正在使用强制IDE Luna Java EE,并将我的Beans.xml文件放在包中; 不过,我在Beans.xmlstring之前 – 用于ClassPathXMLApplicationContext参数 – 与相对path。 所以在我的主应用程序 – 访问Beans.xml文件 – 我有:
ApplicationContext context = new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");
我还注意到,只要将Beans.xml文件从src文件夹移动到包中,XML文件图标的左下angular就有一个Bean图像,当这个xml文件位于包外部时,该图像就不存在了。 这是一个很好的指示器,让我知道现在可以通过ClassPathXMLAppllicationsContext访问beans xml文件。
这对我来说是有效的:
new ClassPathXmlApplicationContext("classpath:beans.xml");