81

我正在尝试在 Spring 中制作我的第一个 bean,但在加载上下文时遇到了问题。我在 src/main/resources 中有一个 bean 的配置 XML 文件。

我收到以下 IOException:

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

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

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

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

这给了我真实的!resources在类路径中。怎么了?

4

19 回答 19

179

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

因为我做了一个声明:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

当 beans.xml 文件存在时,我想我会参考项目的根目录。然后我把配置文件放到 src/main/resources 中,把初始化改成:

ApplicationContext context = new ClassPathXmlApplicationContext("src/main/resources/beans.xml");

它仍然是一个 IO 异常。

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

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

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

谢谢和欢呼!

编辑:

由于我得到了很多人对解决方案的赞许,并且几年前作为学生第一次体验了 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 中以及稍后在类路径中所属的路径。

可以通过使用存档器(即 rar)解压 jar 并查看其目录结构的内容来验证它。

我建议阅读有关类路径的文章作为补充。

于 2012-10-18T14:48:29.737 回答
63

试试这个:

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

file:指向文件系统资源的前缀,而不是类路径。

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

于 2013-12-12T15:10:25.903 回答
21

我也有类似的问题,但由于原因有点不同,所以在这里分享以防万一它可以帮助任何人。

我的文件位置

bean.xml 文件

我是如何使用的

ClassPathXmlApplicationContext("beans.xml");

有两种解决方案

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

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

于 2015-03-13T00:16:13.377 回答
8

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

new ClassPathXmlApplicationContext("beans.xml")

或者像这样

new GenericXmlApplicationContext("classpath:beans.xml");
于 2017-02-21T23:09:48.550 回答
8

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

故障排除步骤

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

2:如果你没有资源文件夹。通过导航新建一个右键单击项目新建 > 源文件夹,将其命名为资源并将您的 XML 文件放在其下。

于 2018-09-29T04:07:58.393 回答
5

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

于 2015-12-26T06:18:16.417 回答
3

我怀疑您正在构建一个 .war/.jar ,因此它不再是一个文件,而是该包中的一个资源。请改用ClassLoader.getResourceAsStream(String path)

于 2012-10-15T10:35:13.823 回答
3

您已经查看了 src 目录。xml 文件确实存在那里。但是请查看设置了所有输出类的类或 bin/build 目录。我怀疑您只需要使用 resources/beans.xml 路径。

于 2012-10-15T14:16:18.477 回答
3

请注意,第一个 applicationContext 是作为 ; 的一部分加载的web.xml。下面提到了这一点。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>META-INF/spring/applicationContext.xml</param-value>
</context-param>

<servlet>
    <servlet-name>myOwn-controller</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>META-INF/spring/applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

如下代码也将尝试再创建一个 applicationContext。

private static final ApplicationContext context = 
               new ClassPathXmlApplicationContext("beans.xml");

查看和之间的区别beans.xmlapplicationContext.xml

如果appliationContext.xmlunder<META-INF/spring/>已声明 with<import resource="beans.xml"/>那么这appliationContext.xml将加载under的beans.xml相同位置META-INF/springappliationContext.xml

然而; 在代码中;如果它声明如下

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

WEB-INF/classes这是在 eclipse 中的 OR 中查看 beans.xml src/main/resources

[如果您添加了beans.xmlatsrc/main/resources那么它可能会在WEB-INF/classes创建 WAR 时放置在。]

因此,总共查找了两个文件。

我已经通过在导入时添加类路径查找解决了这个问题,applicationContext.xml如下所示

<import resource="classpath*:beans.xml" />

并删除了ClassPathXmlApplicationContext("beans.xml")java代码中的这一行,这样只会加载一个ApplicationContext。

于 2016-11-16T09:00:28.327 回答
2

在 Spring 中,所有源文件都在 src/main/java 中。同样,资源通常保存在 src/main/resources 中。因此,请将您的 spring 配置文件保存在资源文件夹中。

确保在 src/main/resources 中也有文件的 ClassPath 条目。

在 .classpath 检查以下 2 行。如果缺少它们,请添加它们。

<classpathentry path="src/main/java" kind="src"/>
<classpathentry path="src/main/resources" kind="src" />

因此,如果您已准备好所有内容,则以下代码应该可以工作。

ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring-Module.xml");

于 2017-03-01T20:39:52.170 回答
1

摇篮:v4.10.3

IDE:IntelliJ

我在使用 gradle 运行构建和测试时遇到了这个问题。到处复制 applicationContext.xml 并没有帮助。即使指定如下的完整路径也无济于事!

context = new ClassPathXmlApplicationContext("C:\\...\\applicationContext.xml");

解决方案(至少对于 gradle 而言)在于 gradle 处理资源的方式。对于我的 gradle 项目,我已经按照https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout中定义的方式布置了工作区

当使用默认 gradle 任务集运行测试时,包括一个“processTestResources”步骤,该步骤在C:\.....\src\test\resources中查找测试资源(Gradle 提供了完整的路径)。

您的 .properties 文件和 applicationContext.xml 需要位于此目录中。如果资源目录不存在(就像我的情况一样),您需要创建它,将文件复制到那里。在此之后,只需指定文件名就可以了。

context = new ClassPathXmlApplicationContext("applicationContext.xml");
于 2019-05-14T16:03:27.193 回答
0

我做了与大多数人相反的事情。我正在使用 Force IDE Luna Java EE,并将 Beans.xml 文件放在包中;但是,我在 Beans.xml 字符串(用于 ClassPathXMLApplicationContext 参数)之前添加了相对路径。所以在我的主应用程序中 - 访问 Beans.xml 文件的那个 - 我有:

    ApplicationContext context = 
         new ClassPathXmlApplicationContext("com/tutorialspoin/Beans.xml");

我还注意到,当我将 Beans.xml 文件从 src 文件夹移动到包中时,XML 文件图标的左下角有一个 Bean 图像,当这个 xml 文件在包之外时,它不存在。这是一个很好的指标,让我知道现在 ClassPathXMLAppllicationsContext 可以访问 beans xml 文件。

于 2015-06-18T14:17:38.630 回答
0

这对我有用:

  new ClassPathXmlApplicationContext("classpath:beans.xml");
于 2016-08-16T13:02:39.563 回答
0

如果这个问题仍然困扰着您并且您正在使用 Eclipse 进行开发,请查看这个 Eclipse 错误:Resources files from "src/main/resources" are not correct included in classpath

解决方案似乎是查看项目的属性、Java 构建路径、源文件夹。删除/src/main/resources目录并重新添加。这会提醒 Eclipse 需要将这些文件复制到类路径。

当使用 Eclipse 的“Neon”版本时,这个错误影响了我。(在我意识到刚刚描述的简单修复之前,我感到非常沮丧)

于 2018-01-08T13:55:35.913 回答
0

我遇到了这个问题,这让我发疯了;我最终在我的 POM.xml 中发现了以下内容,这是问题的原因:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*.properties</include>
        </includes>
    </resource>
</resources>
于 2019-02-19T09:21:11.800 回答
0

我不确定要写,但也许有人节省了几个小时:

mvn clean

如果您的整个配置已经完美,则可以完成这项工作!

于 2019-03-19T12:46:01.813 回答
0

我在这个问题上停留了一段时间,我已经找到了以下解决方案

  1. 创建一个ApplicationContextAware类(这是一个实现ApplicationContextAware的类)
  2. ApplicationContextAware中,我们只需要实现一种方法

    public void setApplicationContext(ApplicationContext context) 抛出 BeansException

  3. 告诉 spring 上下文关于这个新 bean(我称之为 SpringContext)

    bean id="springContext" class="packe.of.SpringContext" />
    

这是代码片段

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContext implements ApplicationContextAware {
  private static ApplicationContext context;

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException {
    this.context = context;
  }
  public static ApplicationContext getApplicationContext() {
    return context;
  }
}
  1. 然后,您可以调用 spring 上下文之外的任何应用程序上下文方法,例如

    SomeServiceClassOrComponent utilityService SpringContext.getApplicationContext().getBean(SomeServiceClassOrComponent .class);
    

我希望这能解决许多用户的问题

于 2019-11-21T04:55:49.133 回答
0

Beans.xml 或 file.XML 未放置在正确的路径下。如果您有 Maven 项目,您应该在资源文件夹下添加 XML 文件。src -> main -> java -> 资源

于 2020-05-26T17:26:15.653 回答
0

我在 IntelliJ 上并面临同样的问题。以下是我如何解决它:

1.在 Spring 应用程序类中添加如下资源导入以及其他导入:@ImportResource("applicationContext.xml")

2.看到 IDE 显示 :Cannot resolve file 'applicationContext.xml'并建议其预期文件的路径(这不是文件 applicationContext.xml 最初保存的资源)

3.将文件复制到预期位置,异常得到解决。

下面的屏幕截图便于参考: 在此处输入图像描述

但是,如果您想将其保留在资源中,请按照下面的这个很好的答案链接并添加资源路径以便对其进行搜索。在没有上述步骤中描述的@ImportResource 的情况下,使用此设置异常可以解决:

https://stackoverflow.com/a/24843914/5916535

于 2021-02-16T19:11:12.700 回答