Spring项目已配置依赖与配置文件,运行时抛出FileNotFoundException
解决Spring中
FileNotFoundException加载Beans.xml的问题 从你的代码和项目结构来看,问题出在配置文件的位置和Spring加载资源的方式不匹配,我来一步步帮你分析和解决:
问题根源
- 先看你的测试代码:
File f = new File("Beans.xml"); System.out.println("Exist test: " + f.exists()); ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");new File("Beans.xml")是从当前程序运行的工作目录查找文件,和Spring类路径的查找逻辑完全不同,所以exists()返回false是正常的,但这不是核心问题。- 真正的问题是:你把
Beans.xml放在了src/main/java目录下,而Maven/Gradle这类主流构建工具默认只会将src/main/resources目录下的资源文件(比如xml、properties)打包到项目的类路径中,src/main/java仅负责编译.java文件,不会将xml这类非源码文件复制到编译后的类路径目录(比如target/classes),所以ClassPathXmlApplicationContext在类路径里找不到这个文件,才抛出FileNotFoundException。
解决方案
方案1:移动配置文件到标准资源目录(推荐)
这是Spring项目的标准实践,简单可靠:
- 将
Beans.xml从src/main/java目录移动到src/main/resources目录下 - 不需要修改任何代码,
new ClassPathXmlApplicationContext("Beans.xml")就能正常加载,因为构建工具会自动把src/main/resources下的文件打包到类路径根目录。
方案2:修改构建工具配置,让src/main/java下的xml文件被打包
如果不想移动文件,可以修改Maven/Gradle配置,让它把src/main/java下的xml文件也加入类路径:
Maven配置(在pom.xml中添加):
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!-- 别忘了保留默认的resources目录配置,避免其他资源无法加载 --> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
修改后执行mvn clean package,构建工具就会把src/main/java下的xml文件复制到target/classes目录,Spring就能正常加载了。
额外提示
- 尽量避免使用绝对路径加载配置文件,因为项目打包部署后,绝对路径会失效,类路径加载的方式更适合Spring项目的可移植性。
- 你也可以直接查看编译后的
target/classes目录,确认Beans.xml是否存在,这是快速排查类路径资源问题的有效方法。
内容的提问来源于stack exchange,提问作者Jyoti Jadhav
相关产品推荐
相关产品推荐

