当 bean xml 配置文件存在时,Spring 无法找到它

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

我收到以下 IOException:

线程“ main”org.springframework.beans.Factory 中的异常。 BeanDefinition itionStoreException: 从类路径资源[ src/main/resources/beans.XML ]解析 XML 文档时的 IOException; 嵌套异常是

例外: 类路径资源[ src/main/resources/beans.xml ]不能 被打开,因为它不存在

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

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

这就是真的! resources在类路径中。怎么了?

265003 次浏览

我怀疑你在建造一个。战争/。因此它不再是一个文件,而是包中的一个资源。试试 GetResourceAsStream (字符串路径)

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

谢谢,但这不是解决办法,我知道为什么这对我不起作用了。

因为我说过:

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”。

This is a convention respected by many tools like maven or sbt in process of building project (note: as a default configuration!). When code (from the post) was in running mode, it couldn't find nothing like "src/main/resources/beans.xml" due to the fact, that beans.xml was in the root of jar (copied to /beans.xml in created jar/ear/war).

在使用 ClassPathXmlApplicationContext 时,bean xml 定义的适当位置声明是“/beans.xml”,因为这是它属于 jar 和类路径的路径。

它可以通过使用归档程序(即 rar)解压一个 jar 进行验证,并通过目录结构查看其内容。

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

试试这个:

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

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

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

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

我的文件位置

beans.xml file

我是怎么吸毒的

ClassPathXmlApplicationContext("beans.xml");

有两种解决方案

  1. 从包中取出 beans.xml 并放入 default 包。
  2. 在使用包时指定包名称 viz。

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

我做了大多数相反的事。我使用的是 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 文件在包外时,这个图像并不存在。这是一个很好的指示器,它让我知道现在可以通过 ClassPathXMLApplicationsContext 访问 bean xml 文件了。

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

这就是对我有效的方法:

  new ClassPathXmlApplicationContext("classpath:beans.xml");

注意,第一个 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之间的 不同

如果 <META-INF/spring/>下的 appliationContext.xml已经用 <import resource="beans.xml"/>声明,那么这个 appliationContext.xml正在 appliationContext.xml的同一位置 META-INF/spring下装载 beans.xml

在代码中,如果声明如下

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

这是在 eclipsesrc/main/resources中的 WEB-INF/classes处查看 beans.xml。

[如果在 src/main/resources处添加了 beans.xml,那么在创建 WAR 时它可能被放置在 WEB-INF/classes处。]

所以完全可以查找 文件。

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

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

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

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

new ClassPathXmlApplicationContext("beans.xml")

或者像这样

new GenericXmlApplicationContext("classpath:beans.xml");

在 Spring 中,所有源文件都在 src/main/java 中。类似地,资源通常保存在 src/main/resources 中。因此,请将 Spring 配置文件保存在 resources 文件夹中。

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

检查以下2行。如果它们丢失,请添加它们。

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

所以,如果你把一切都准备好了,下面的代码应该可以工作。

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

如果这个问题仍然困扰着您,并且您正在使用 Eclipse 进行开发,那么请看一下这个 Eclipse bug: 类路径中没有正确包含来自“ src/main/Resources”的资源文件

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

这个 bug 在使用 Eclipse 的“ Neon”版本时影响了我。(我非常沮丧,直到我意识到刚才描述的简单修复)

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

解决问题的步骤

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

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

我正在经历这个问题,它快把我逼疯了; 我最终在 POM.xml 中发现了以下内容,这就是问题的原因:

<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>

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

mvn clean

可以做的工作,如果你的整个配置已经是完美的!

等级 : v4.10.3

IDE : IntelliJ

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

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

解决方案(至少对于分级来说)在于分级处理资源的方式。对于我的年级项目,我已经布置了工作空间定义在 https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_project_layout

当使用默认的分级任务集运行测试时,包括一个“ processTestResources”步骤,该步骤在 ... ... src 测试资源上查找测试资源(Gradle 有助于提供完整的路径)。

你的。Properties 文件和 applicationContext.xml 需要位于此目录中。如果资源目录不存在(就像我的情况一样) ,您需要在那里创建文件的副本。在此之后,简单地指定文件名就可以了。

context = new ClassPathXmlApplicationContext("applicationContext.xml");

我已经在这个问题上纠缠了一段时间,我得出了下面的解决方案

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

    Public void setApplicationContext (ApplicationContext context)抛出 BeansException

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

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

Here is the code snippet

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);
    

I hope this will solve the problem for many users

Xml 或 file.XML 没有放在正确的路径下。如果您有 Maven 项目,则应该在资源文件夹下添加 XML 文件。 Src-> main-> java-> Resources

我在 IntelliJ 上面临着同样的问题,下面是我是如何解决它的:

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

2.看到 IDE 显示: Cannot resolve file 'applicationContext.xml',并且还建议了它期望文件的路径(它不是保存文件 applicationContext.xml 的资源)

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

下面的屏幕截图便于参考: enter image description here

但是,如果你想保持它在资源,然后按照下面这个伟大的答案链接,并添加资源路径,使其得到搜索。通过此设置,异常解决方案中没有上述步骤中描述的@Import Resource:

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

分享我的案例以及我如何调试它,也许能帮到某人:

这将只有当你首先检查你实际上有 resources文件夹在正确的地方和正确的命名相关

  1. 在某个地方创建一些临时文件夹,最好是在任何 git 项目之外(例如 mkdir playground) ,然后移动到那里(cd playground)
  2. 在那里复制缺少 beans.xml 的 java 归档文件(例如 cp /path/to/java.war .)
  3. 解压缩它(例如,在 ubuntu 上使用 unzip java.war)
  4. 看看有没有。在那里的 xml 文件(例如在 WEB-INF/class 中)(解包过程应该显示正在解包的文件列表,其中大部分可能是其他依赖项作为归档,这些是不相关的)
  5. 如果您没有看到 beans.xml,那么只需读取另一个。Xml 文件(例如 cat root-config.xml) ,您可能会发现类似于 root-config.xml或类似的东西,在那里您可能有一些其他的 <import resource="somethingelse.xml">记录或什么都没有。
  6. 如果是这种情况,这意味着您确实在项目中存在该文件(这里是 root-config.xml) ,或者如果不存在,则继续向上访问父项目,直到打包存档文件的位置。查找该文件,添加 <import resource="beans.xml">并运行 mvn package

现在通过执行1.5中的步骤来验证修复。应该会导致新打包的归档文件(这里是 root-config.xml)中定义了 beans.xml,并且一旦部署了它,它应该就可以工作了。

确保 beans.xml 位于 resources 文件夹中。