spring - 从类路径加载GenericXmlApplicationContext

时间:2013-11-17 16:06:36

标签: java xml spring data-structures filenotfoundexception

我刚开始春天。

我无法理解为什么当我编写一些简单示例并尝试使用ApplicationContents加载时如下:

package com.appres.prospring3.ch5.factory;

public class MessageDigestExample {
    public static void main(String[] args) {
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("classpath:factory/factory.xml");
        context.refresh();

        MessageDigester digester = (MessageDigester) context.getBean("digester");
        digester.digest("Hello World !!!!!!!!!");
    }
}

正好在这一行之后:

  

context.load( “类路径:工厂/ factory.xml”);

发送异常消息:

  

17:59:44,480 INFO eans.factory.xml.XmlBeanDefinitionReader:315 - 从类路径资源[factory / factory.xml]加载XML bean>定义   线程“main”中的异常org.springframework.beans.factory.BeanDefinitionStoreException:> IOException从类路径资源[factory / factory.xml]解析XML文档;嵌套>异常是java.io.FileNotFoundException:类路径资源[factory / factory.xml]>无法打开,因为它不存在

在我看来,一切都应该奏效。我无法弄清楚这里有什么问题。

这是我的项目结构:

class path into package

但是,当我将myFile.xml移至resources包时:

resources path

将context.load()更改为context.load("classpath:factory.xml");

一切正常,我可以看到正确的结果:

Using digest1
Using algorithm: SHA1
[B@5e9ed26e
Using digest2
Using algorithm: MD5
[B@d09644a

修改

当然,我尝试了加载此.xml文件的最长路径,如下:

  

context.load( “类路径:COM / appress / prospring3 / CH5 /工厂/ factory.xml”);

它抛出 一堆例外

Exception in thread "main" 18:15:22,385  INFO eans.factory.xml.XmlBeanDefinitionReader: 315 - Loading XML bean definitions from class path resource [com/appress/prospring3/ch5/factory/factory.xml]
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/appress/prospring3/ch5/factory/factory.xml]; nested exception is java.io.FileNotFoundException: class path resource [com/appress/prospring3/ch5/factory/factory.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
    at org.springframework.context.support.GenericXmlApplicationContext.load(GenericXmlApplicationContext.java:105)
    at com.appres.prospring3.ch5.factory.MessageDigestExample.main(MessageDigestExample.java:8)
Caused by: java.io.FileNotFoundException: class path resource [com/appress/prospring3/ch5/factory/factory.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:328)
    ... 7 more

- 为什么会发生这种情况?   - 以某种方式存在从同一位置执行此操作。 main()在哪里?

3 个答案:

答案 0 :(得分:3)

第一个版本有两个问题。

  1. xml文件位于src/main/java下,而不是src/main/resources下。当Maven构建您的项目时,它希望只在src/main/java下找到Java源文件,并忽略所有其他文件。资源文件必须放在src/main/resources下。那是Maven的惯例。
  2. 代码从资源工厂/ factory.xml加载文件。这意味着factory.xml应该在包factory中找到。但该文件位于包com.appres.prospring3.ch5.factory

答案 1 :(得分:0)

将完整的包名添加到路径后,第一个版本也可以正常工作:

context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");

将配置文件保留在resources文件夹中仍然更好,因为按惯例配置文件应始终在那里。

答案 2 :(得分:0)

classpath:前缀始终相对于类路径的根。因此

context.load("classpath:factory/factory.xml");

在类路径的根目录factory.xml处寻找/factory/factory.xml,您显然没有。您需要将完全限定的包名称放在

的位置
context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");

src/main/resources文件夹是Maven约定。 Maven将获取该文件夹中的所有文件并将它们添加到类路径的根目录(或相对于它们的嵌套文件夹/包。因此,在第二个示例中,factory.xml找到了到类路径根目录的路径,您可以使用

访问它
context.load("classpath:factory.xml");