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

Java跨模块读取XML遇FileNotFoundException:路径还是代码问题?

解决XML文件找不到及代码错误的问题

首先,你的FileNotFoundException主要是跨模块资源读取方式错误导致的,同时代码里还有一个明显的逻辑bug,咱们一步步解决:

1. 核心问题:跨模块资源不能用FileReader直接读取

你用new File(filePath)去读取跨模块的XML文件,这种方式是基于当前程序运行的工作目录来查找文件的,而不同模块的文件在项目编译、运行时的路径和你写的相对路径不匹配,所以系统找不到指定文件。

正确的做法是把XML文件放到对应模块的resources目录下,然后用类加载器来读取资源(类加载器会自动处理模块间的资源路径):

  • 如果XML是测试专用的,放到测试模块的src/test/resources/module/docs/目录下;
  • 如果XML是主模块的业务资源,放到主模块的src/main/resources/module/docs/目录下。

2. 修复convertXMLToString方法的两个错误

你的转换方法有两个明显问题:

  • 最后返回的是line,循环结束后line已经是null了,应该返回sb.toString();
  • 用FileReader读取跨模块资源的方式错误,改用类加载器获取输入流。

修改后的方法:

public static String convertXMLToString(String resourcePath) throws IOException {
    // 用类加载器获取跨模块资源流
    try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath);
         BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        if (is == null) {
            throw new FileNotFoundException("Resource not found: " + resourcePath);
        }
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line.trim());
        }
        // 返回拼接后的字符串,不是line!
        return sb.toString();
    }
}

调用这个方法时,路径直接写"module/docs/document1.xml"即可(因为resources目录是类加载器的资源根路径)。

3. XMLUnit配置的小优化

你在测试方法和assertXMLEquals里都设置了XMLUnit.setIgnoreWhitespace(true),重复配置了,建议只在assertXMLEquals里统一配置一次就行,避免冗余。

总结

  • 必须把XML文件移到对应模块的resources目录下,这样类加载器才能正确找到跨模块资源;
  • 修复convertXMLToString的返回值错误和资源读取方式;
  • 调整后就能解决FileNotFoundException,同时保证XML内容正确读取用于校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:15:25