You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件存在但ClassPathXmlApplicationContext报FileNotFoundException

问题原因

ClassPathXmlApplicationContext的加载逻辑是仅从类加载器管辖的classpath路径下查找资源,你传入磁盘绝对路径后,它会把这整串绝对路径字符串当成classpath下的资源名去匹配,根本不会按磁盘文件路径去读文件,自然会抛出找不到资源的异常。
另外你的配置本身不符合Maven项目的默认规则:Maven默认只会把src/main/resources下的非Java文件打包到输出类路径,放在src/main/java下的xml文件默认不会被编译拷贝到classpath目录,就算修正加载逻辑也容易出现读不到的问题。

修复方法

二选一即可,优先选第一种标准方案:

  • 标准方案(推荐)
    把spring.xml文件从src/main/java目录移动到src/main/resources目录下,加载时直接传入类路径下的相对文件名即可,不需要获取文件绝对路径:
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    Vehicle v1 = (Vehicle) context.getBean("vehicle");
    v1.drive();
    
    这种写法不依赖项目在磁盘上的存储位置,本地开发、测试、生产部署都能正常运行,是Spring XML配置的常规用法。
  • 临时兼容方案(不推荐生产使用)
    如果暂时不想调整文件位置,也不想改路径写法,就把上下文实现类换成支持磁盘绝对路径加载的FileSystemXmlApplicationContext,它会直接按你传入的文件系统路径读取文件:
    ApplicationContext context = new FileSystemXmlApplicationContext(f.getAbsolutePath());
    Vehicle v1 = (Vehicle) context.getBean("vehicle");
    v1.drive();
    
    这种写法硬绑定了本地文件路径,项目换目录、换部署环境就会失效,只适合临时调试用。

内容的提问来源于stack exchange,提问作者Smit Chawda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:15:37