[英]spring - GenericXmlApplicationContext loading from classpath
我刚到春天。
我不明白为什么当我写一些简单的示例并尝试按如下方式将其与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(“ classpath:factory / factory.xml”);
正在进行的异常消息:
17:59:44,480 INFO eans.factory.xml.XmlBeanDefinitionReader:315-从类路径资源[factory / factory.xml]加载XML bean>定义从类路径资源[factory / factory.xml]中解析XML文档; 嵌套> exception是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(“ classpath:com / appress / prospring3 / ch5 / factory / 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()在哪里?
第一个版本有两个问题。
src/main/java
,而不位于src/main/resources
。 当Maven构建项目时,它期望仅在src/main/java
下找到Java源文件,而忽略所有其他文件。 资源文件必须放在src/main/resources
。 那就是Maven约定。 factory
中。 但是该文件位于com.appres.prospring3.ch5.factory
包中。 将完整的软件包名称添加到路径后,第一个版本也将运行:
context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");
最好将配置文件保留在resources文件夹中,因为按照惯例,配置文件应始终放在该文件夹中。
classpath:
前缀始终相对于您的类路径的根。 因此
context.load("classpath:factory/factory.xml");
在类路径的根目录/factory/factory.xml
中寻找factory.xml
,您显然没有。 您需要输入完全合格的软件包名称才能找到它所在的位置
context.load("classpath:com/appress/prospring3/ch5/factory/factory.xml");
src/main/resources
文件夹是Maven约定。 Maven将获取该文件夹中的所有文件,并将它们添加到类路径的根目录(或相对于它们嵌套的文件夹/包的根目录。)因此,在您的第二个示例中, factory.xml
找到了到达该类路径的根目录的方式,您可以对其进行访问与
context.load("classpath:factory.xml");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.