zoukankan      html  css  js  c++  java
  • Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist

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

    问题说明:

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

    项目结构如下:

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

    打开bin文件夹,目录如下

    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     <!-- 配置bean -->
     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.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(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路径),该问题解决了。
    现在目录树如下:
       --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     <!--
     9                      配置bean 
    10         class:bean的全类名,通过反射的方式在IOC容器中创建Bean实例,所以要求Bean中必须有无参的构造器
    11         id:标识容器中的bean,id唯一
    12     -->
    13     <bean id="helloWorld" class="com.tt.spring.beans.HelloWorld">
    14          <property name="name" value="Spring"></property>
    15     </bean>   
    16     
    17     <!-- 通过构造方法来配置bean的属性 -->
    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

    控制台打印信息如下:

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

    原因分析:

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

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

     

    所以说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的那一层。

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

  • 相关阅读:
    iou与giou对比
    Linux学习第一天 vim
    奖励加分申请
    人月神话阅读笔记3
    5.27
    5.26
    5.25
    5.23
    5.22
    5.21
  • 原文地址:https://www.cnblogs.com/sharpest/p/7446332.html
Copyright © 2011-2022 走看看