如何在 bazel 测试中读取资源文件?

How to read a resource file in bazel test?

我正在将一些集成测试从 gradle 迁移到应用程序的 bazel。作为集成测试的一部分,资源被加载为

final String resourcePath = SomeClass.class.getResource("/test.properties").getPath()

如果我跟踪此代码路径,当我 运行 来自 IntelliJ 的此测试时,对于 gradle,此路径是一个绝对路径,如

/Users/me/..../test.properties

但是,对于 bazel,它看起来像

file:/private/var/tmp/_bazel_me/4f1994ece960b360388a372b5e6aa4b2/execroot/project/bazel-out/darwin-fastbuild/bin/project/src/integrationTest/package/Test.jar!/test.properties

所以这个字符串 resourcePath 被提供给一个框架,该框架加载

Files.exists(resourcePath)

这适用于绝对路径但不适用于基于 jar 的路径。由于我无法控制框架代码,我该如何解决这个问题?

如果您正在使用 java_test 或 java_library 的 resources 属性,那么资源确实会打包在该目标的 jar 中: https://docs.bazel.build/versions/main/be/java.html#java_test.resources

听起来您可能想尝试使用 data 属性,它将文件放在 runfiles 目录(即执行测试/二进制文件的目录)中。在这里查看答案:how to find path to Java source code files from JUnit tests execution via Bazel