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
问题分析:
现在目录树如下:
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 ClassPathXmlApplicationContext("applicationContext.xml")
如果使用 FileSystemXmlApplicationContext 读取,则需把配置文件放到整个项目的根目录