文件存在但ClassPathXmlApplicationContext报FileNotFoundException
问题原因
ClassPathXmlApplicationContext的加载逻辑是仅从类加载器管辖的classpath路径下查找资源,你传入磁盘绝对路径后,它会把这整串绝对路径字符串当成classpath下的资源名去匹配,根本不会按磁盘文件路径去读文件,自然会抛出找不到资源的异常。
另外你的配置本身不符合Maven项目的默认规则:Maven默认只会把src/main/resources下的非Java文件打包到输出类路径,放在src/main/java下的xml文件默认不会被编译拷贝到classpath目录,就算修正加载逻辑也容易出现读不到的问题。
修复方法
二选一即可,优先选第一种标准方案:
- 标准方案(推荐)
把spring.xml文件从src/main/java目录移动到src/main/resources目录下,加载时直接传入类路径下的相对文件名即可,不需要获取文件绝对路径:
这种写法不依赖项目在磁盘上的存储位置,本地开发、测试、生产部署都能正常运行,是Spring XML配置的常规用法。ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); Vehicle v1 = (Vehicle) context.getBean("vehicle"); v1.drive(); - 临时兼容方案(不推荐生产使用)
如果暂时不想调整文件位置,也不想改路径写法,就把上下文实现类换成支持磁盘绝对路径加载的FileSystemXmlApplicationContext,它会直接按你传入的文件系统路径读取文件:
这种写法硬绑定了本地文件路径,项目换目录、换部署环境就会失效,只适合临时调试用。ApplicationContext context = new FileSystemXmlApplicationContext(f.getAbsolutePath()); Vehicle v1 = (Vehicle) context.getBean("vehicle"); v1.drive();
内容的提问来源于stack exchange,提问作者Smit Chawda
相关产品推荐
相关产品推荐

