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 …)

我也有一个类似的问题,但由于有点不同的原因,所以在这里分享,以防万一它可以帮助任何人。

我的文件位置

beans.xml文件

我是怎么用的

ClassPathXmlApplicationContext("beans.xml");

有两个解决scheme

  1. 将beans.xml从包中取出并放入默认包中。
  2. 在使用时指定包名,

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.xmlapplicationContext.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");