如何在 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
我正在将一些集成测试从 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