我刚开始春天。
我无法理解为什么当我编写一些简单示例并尝试使用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]>无法打开,因为它不存在
在我看来,一切都应该奏效。我无法弄清楚这里有什么问题。
这是我的项目结构:
但是,当我将myFile.xml
移至resources
包时:
将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()在哪里?
答案 0 :(得分:3)
第一个版本有两个问题。
src/main/java
下,而不是src/main/resources
下。当Maven构建您的项目时,它希望只在src/main/java
下找到Java源文件,并忽略所有其他文件。资源文件必须放在src/main/resources
下。那是Maven的惯例。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");