当Spring xml配置文件存在时,它找不到它

daw*_*icz 67 configuration spring javabeans applicationcontext

我试图在Spring中创建我的第一个bean但是在加载上下文时遇到了问题.我在src/main/resources中有一个bean的配置XML文件.

我收到以下IOException:

线程"main"中的异常org.springframework.beans.factory.BeanDefinitionStoreException:从类路径资源[src/main/resources/beans.xml]解析XML文档的IOException; 嵌套异常是

java.io.FileNotFoundException:类路径资源[src/main/resources/beans.xml]无法打开,因为它不存在

但我不明白,因为我做了以下代码测试:

File f = new File("src/main/resources/beans.xml");
System.out.println("Exist test: " + f.exists());
Run Code Online (Sandbox Code Playgroud)

这让我真实!resources在类路径中.怎么了?

daw*_*icz 142

谢谢,但那不是解决方案.我发现它为什么不适合我.

自从我做了一个宣言:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Run Code Online (Sandbox Code Playgroud)

当bean.xml文件存在时,我以为我会引用项目的根目录.然后我将配置文件放到src/main/resources并将初始化更改为:

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");
Run Code Online (Sandbox Code Playgroud)

它仍然是一个IO例外.

然后该文件保留在src/main/resources /中,但我将声明更改为:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Run Code Online (Sandbox Code Playgroud)

它解决了这个问题 - 也许对某人有帮助.

谢谢,欢呼!

编辑:

由于我让很多人赞成这个解决方案并且几年前曾作为学生初次体验过Spring,所以我很想解释为什么它会起作用.

在编译和打包项目时,项目中'src/main/java'的所有文件和子目录都会进入打包jar的根目录(我们要创建的工件).同样的规则适用于'src/main/resources'.

这是一个在构建项目过程中受到maven或sbt等许多工具所尊重的约定(注意:作为默认配置!).当代码(来自帖子)处于运行模式时,它找不到像"src/main/resources/beans.xml"那样的东西,因为beans.xml位于jar的根目录中(复制到/ beans) .xml在创建的jar/ear/war中).

使用ClassPathXmlApplicationContext时,bean xml定义的正确位置声明(在本例中为"/beans.xml"),因为这是它在jar中以及稍后在classpath中的路径.

可以通过使用归档程序(即rar)解压缩jar来验证它,并使用目录结构查看其内容.

我建议阅读有关classpath的文章作为补充.

  • 我看到你将`beans.xml`更改为`src/main/resources/beans.xml`然后*back*更改为`beans.xml`.谢谢. (2认同)

Mik*_*kov 48

试试这个:

new ClassPathXmlApplicationContext("file:src/main/resources/beans.xml");

file: preffix指向文件系统资源,而不是classpath.

文件路径可以是相对的还是系统的(/ home/user/Work/src ...)


Kal*_*her 19

我也遇到了类似的问题,但是因为有点不同的原因所以在这里分享,以防它可以帮助任何人.

我的档案位置

beans.xml文件

我是怎么用的

ClassPathXmlApplicationContext("beans.xml");

有两种解决方案

  1. 从包中取出beans.xml并放入默认包.
  2. 使用时指定包名称即可.

ClassPathXmlApplicationContext("com/mypackage/beans.xml");


Sto*_*ica 6

src/main/resources是一个源目录,您不应该直接引用它.在构建/打包项目时,内容将被复制到类路径的正确位置.然后你应该像这样加载它

new ClassPathXmlApplicationContext("beans.xml")
Run Code Online (Sandbox Code Playgroud)

或者像这样

new GenericXmlApplicationContext("classpath:beans.xml");
Run Code Online (Sandbox Code Playgroud)


Dee*_*hah 5

用它 ApplicationContext context = new FileSystemXmlApplicationContext("Beans.xml");


小智 5

这是因为applicationContect.xml或any_filename.XML没有放置在正确的路径下。

故障排除步骤

1:将XML文件添加到资源文件夹下。

2:如果没有资源文件夹。通过右键单击new来导航新项目,然后单击新建> Source Folder,将其命名为资源,然后将XML文件放在其下。