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

使用Bazel加载Java测试资源file.json时触发FileNotFound异常如何解决?

问题原因
  • 资源读取逻辑错误:Bazel 默认会把resources属性指定的文件打进测试的 classpath JAR 包中,getResource()返回的路径是 JAR 包内的虚拟路径,不属于磁盘上的独立文件,通过new File()根本无法读取到 JAR 内部的资源,所以会抛出 FileNotFound 异常,你打印的绝对路径本质是 JAR 内的路径,不是真实的磁盘文件路径。
  • 构建配置路径不匹配:你的项目结构里测试源码、资源直接放在project/test/目录下,但 BUILD 文件中写的src/test/java、//xxx/xxx/app/src/test/resources:file.json和实际路径完全不匹配,导致资源根本没有被正确引入测试环境。
  • 沙箱隔离限制:Bazel 的测试运行在独立的沙箱环境中,只有显式声明的文件才会被放进沙箱,路径配置错误的情况下文件不会进入沙箱,自然读取不到。
解决方法

第一步:修正 BUILD 配置

修改project/BUILD.bazel中的配置,修正路径,如果你需要拿到独立的 File 对象,需要把资源加到data属性中:

java_junit5_test(
    name = "snapshot_admin_app_test",
    # 修正源码路径,和实际项目结构匹配
    srcs = glob(["test/java/**/*.java"]),
    # 修正资源路径
    resources = glob(["test/resources/**/*.*"]),
    # 新增data配置,让file.json作为独立文件放入沙箱
    data = ["//test/resources:file.json"],
    test_package = "com.xxx.xxx",
    # 如果后面用Runfiles工具,需要加上对应的依赖
    deps = DEPS + TESTING_DEPS + ["@bazel_tools//tools/java/runfiles"],
)

project/test/resources/BUILD.bazel的exports_files配置不需要改动。

第二步:修正资源读取代码

场景1:不需要File对象,只需要读取文件内容

直接读取输入流即可,不需要转成File:

import org.apache.commons.io.IOUtils;
import java.nio.charset.StandardCharsets;

public class Utils {
    public static String getSnapshotTestData() {
        try (var inputStream = Utils.class.getClassLoader().getResourceAsStream("file.json")) {
            if (inputStream == null) {
                throw new RuntimeException("classpath中未找到file.json,请检查构建配置");
            }
            String data = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
            System.out.println("Data: " + data);
            return data;
        } catch (Exception e) {
            throw new RuntimeException("读取资源文件失败", e);
        }
    }
}

场景2:业务逻辑必须使用File对象

使用Bazel官方提供的Runfiles工具读取沙箱中的独立文件:

import com.google.devtools.build.runfiles.Runfiles;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;

public class Utils {
    public static File getSnapshotTestData() throws Exception {
        Runfiles runfiles = Runfiles.create();
        // 路径格式为 工作空间名/资源相对项目根目录的路径,默认工作空间名为__main__
        File file = new File(runfiles.rlocation("__main__/test/resources/file.json"));
        String data = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
        System.out.println("Data: " + data);
        return file;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:27:01