从Maven标准目录到Bazel的测试资源映射

从Maven标准目录到Bazel的测试资源映射,bazel,Bazel,我们在src/test/resources中有测试依赖项文件。当测试类通过(例如)获取这些测试文件时,这些测试文件最终位于JAR和类路径中 在Bazel中,依赖于测试文件并将其显示在类路径中的首选方式是什么 我的src/test/resources/BUILD中有以下内容: filegroup( name = "test-deps", testonly = 1, srcs = glob(["*.txt"]), visibility = ["//visibility

我们在
src/test/resources
中有测试依赖项文件。当测试类通过(例如)获取这些测试文件时,这些测试文件最终位于JAR和类路径中

在Bazel中,依赖于测试文件并将其显示在类路径中的首选方式是什么

我的
src/test/resources/BUILD中有以下内容:

filegroup(
    name = "test-deps",
    testonly = 1,
    srcs = glob(["*.txt"]),
    visibility = ["//visibility:public"],
)
java_test(
    name = "MyTest",
    srcs = ["MyTest.java"],
    resources = ["//src/test/resources:test-deps"],
    test_class = "com.path.to.my.test.MyTest",
    deps = [
        "//src/main/com/path/to/my/code",
        "//:junit_junit",
    ],    
)
在my
src/main/java/com/path/to/my/test/BUILD中有以下内容:

filegroup(
    name = "test-deps",
    testonly = 1,
    srcs = glob(["*.txt"]),
    visibility = ["//visibility:public"],
)
java_test(
    name = "MyTest",
    srcs = ["MyTest.java"],
    resources = ["//src/test/resources:test-deps"],
    test_class = "com.path.to.my.test.MyTest",
    deps = [
        "//src/main/com/path/to/my/code",
        "//:junit_junit",
    ],    
)

这是可行的,但我不确定这是否是Bazel的最佳方法。

是的,这是推荐的方法。如中所述,Bazel了解Maven标准目录布局,并将数据文件放在正确的类路径:

jar文件中资源的位置由 项目结构。巴泽尔首先寻找马文的标准 目录布局,(一个“src”目录后跟一个“resources” 目录孙子)

如果您想单独捆绑资源,可以创建一个仅限资源的jar,然后使用属性依赖它


编辑:正如Ittai在下面指出的,Bazel不会对资源进行内省,因此您必须小心不要导致任何冲突(例如,pkg1/src/main/resources/foo和pkg2/src/main/resources/foo)。
resources
not
resource\u jars
都不会为您检查这一点,因此,如果这是一个问题,您可能希望将您需要的任何资源放在一个文件组中,并有一个genrule目标或测试来检查冲突。

在阅读了有关资源\u jars的内容后,这听起来可能是生产代码的一个不明智的选择,不是?由于它可能会将同一资源的多个副本带到生产上的多个JAR
resources
实际上也不会保护您,因此添加了一节关于此的内容。是的,我同意。我们现在正在做的是创建一个新的java_库目标,并将其添加为依赖项