Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene...

感谢:http://blog.chinaunix.net/uid-20681545-id-184633.html提供的解决方案,非常棒 !

问题说明:

新建一个Spring项目,新建一个Bean类:HelloWorld类,Main.java是主程序,xml是Spring配置文件。

项目结构如下:

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第1张图片

 

打开文件夹,src目录下的结构如下: 

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第2张图片

 

打开bin文件夹,目录如下

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第3张图片

 

HelloWorld.java代码:

复制代码
 1 package com.tt.spring.beans;
 2 
 3 public class HelloWorld {
 4  5  private String name;  6  7  public void setName(String name) {  8  this.name = name;  9  } 10 11  public void hello(){ 12  System.out.println("hello: "+name); 13  } 14 15 }
复制代码

Main.java

复制代码
 1 package com.tt.spring.beans;
 2 
 3 import org.springframework.context.ApplicationContext;  4 import org.springframework.context.support.ClassPathXmlApplicationContext;  5  6 public class Main {  7  8 public static void main(String[] args){  9 /* 10  //创建HelloWorld的一个对象 11  HelloWorld helloWorld = new HelloWorld(); 12  //为name属性赋值 13  helloWorld.setName("tt"); 14 */ 15 //调用hello方法 16 17 //1.创建Spring 的 IOC 容器对象 18 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 19 20 //2.从IOC容器中获取Bean实例 21 HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld"); 22 23 //3.调用Hello方法 24  helloWorld.hello(); 25 26  } 27 }
复制代码

applicationContext.xml:

复制代码
 1 xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"  3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  4  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  5  6   7 <bean id="helloWorld" class="com.tt.spring.beans.HelloWorld">  8 <property name="name" value="Spring">property>  9 bean> 10 beans>
复制代码

运行Main.java程序,结果显示报错。报错如下:

信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:343)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:251)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
at com.tt.spring.beans.Main.main(Main.java:18)
Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329)
... 13 more

 

 

问题分析:

个人的文件目录树大概这样:
 
SpringDemo根目录
   --src java源文件
   --WEB-INF
        --web.xml
        --applicationContext.xml
        --classes文件夹
           --com包
              --java编译后的class文件
   --index.jsp

 

根据网上查找的解决办法,我把applicationContext.xml从bin的com层的最里面复制出来放到classess文件夹即bin文件夹中(不能放到com中,应为xml中class路径),该问题解决了。
Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第4张图片
现在目录树如下:

 

   --src java源文件
   --WEB-INF
         --web.xml
         --classes文件夹
             --applicationContext.xml
             --com包
                  --java编译后的class文件
   --index.jsp
 
但是,当新建另一个Bean:Car类时,问题马上来了!!!!!!!
复制代码
 1  1 package com.tt.spring.beans;
 2  2 
 3  3 public class Car {  4 4  5 5 private String brand;  6 6 private String corp;  7 7 private int price;  8 8 private int maxSpeed;  9 9 10 10 11 11 public Car() { 12 12 System.out.println("Car's Constructor"); 13 13 } 14 14 15 15 public Car(String brand, String corp, int price) { 16 16 super(); 17 17 this.brand = brand; 18 18 this.corp = corp; 19 19 this.price = price; 20 20 } 21 21 22 22 @Override 23 23 public String toString() { 24 24 return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price + ", maxSpeed=" + maxSpeed + "]"; 25 25 } 26 26 27 27 }
复制代码

applicationContext.xml

复制代码
 1 xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"  3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  4  xsi:schemaLocation="http://www.springframework.org/schema/beans  5  http://www.springframework.org/schema/beans/spring-beans.xsd">  6  7 <context:component-scan base-package="com.tt.spring.beans">context:component-scan>  8  13 <bean id="helloWorld" class="com.tt.spring.beans.HelloWorld"> 14 <property name="name" value="Spring">property> 15 bean> 16 17  18 <bean id="car" class="com.tt.spring.beans.Car"> 19 <constructor-arg value="Audi">constructor-arg> 20 <constructor-arg value="chengdu">constructor-arg> 21 <constructor-arg value="30000">constructor-arg> 22 bean> 23 24 beans>
复制代码

Main.java

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第5张图片

 

控制台打印信息如下:

 

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第6张图片

 

看到没?只能获取一个bean实例,不能获取两个。

原因分析:

在项目里,applicationContext.xml是在src最里面一层的,不在src的那一层,所以一旦运行Main.java文件,相应的就会在bin的目录下生成对应的applicationContext.xml文件。

Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第7张图片

但是我们又在bin文件夹里做过粘贴applicationContext.xml。

 Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第8张图片

所以说applicationContext.xml的目录压根就是混乱的!!!既是处于根目录,又处于com最里面的目录。

要么在项目上将xml移到src那一层,那么bin底下的xml也对应着-------xml就处于根目录。

要么在项目上仍然位于com的最里面,那么bin那里就不要将xml移出来----xml就处于最里面的目录

至于xml文件究竟在哪个目录,就该用相应的读取方式。

 

ClassPathXmlApplicationContext和FileSystemXmlApplicationContext读取xml

 
  ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WEB-INF/classes/applicationContext.xml"); 

 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") 
 
 现在这个项目是使用ClassPathXmlApplicationContext读取xml文件的,就把配置文件appicationContext.xml放到src的那一层。
Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene..._第9张图片

 

如果使用FileSystemXmlApplicationContext读取,则需把配置文件放到整个项目的根目录

你可能感兴趣的:(Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opene...)