使Bazel maven依赖项不链接,但在测试中可用

hivapdat  于 2022-11-28  发布在  Maven
关注(0)|答案(1)|浏览(145)

我有一个依赖于maven包的代码,我不希望这个依赖被打包到一个最终的JAR中,实际上,我希望在最终的包中只有源代码,没有所有的依赖(这样做的原因是所有的依赖在类路径中已经可用)。
rules_jvm_external中,有一个neverlink选项将依赖项标记为仅编译。

maven_install(
    artifacts = [
        maven.artifact("org.example.package", "my-dependency", "1.0.0", neverlink=True),
    ],
    ...
)

这是可行的,但问题是测试使用相同的WORKSPACE文件定义,并且由于依赖关系在运行时不可用,因此它们会以java.lang.NoClassDefFoundError失败。
所以我想做到这两点:

  • 使依赖项在测试中可用
  • 不要在部署的JAR中包含依赖关系

我该怎么做?

0s7z1bwu

0s7z1bwu1#

rules_jvm_external允许指定几个maven_install声明来处理具有同一工件的不同版本的多个项目:链接。
我不确定这是否是正确的方法,因为我没有不同的版本-我有不同的元数据为同一个包代替-但它的工作。
在我的WORKSPACE文件中,我执行了以下操作:

maven_install(
    name = "maven_distribution",
    artifacts = [
        maven.artifact("org.example.package", "my-dependency", "1.0.0", neverlink=True),
    ],
    ...
)

maven_install(
    name = "maven_tests",
    artifacts = [
        maven.artifact("org.example.package", "my-dependency", "1.0.0", testonly=True),
    ],
    ...
)

BUILD文件中为java/源代码:

java_library(
    name = "hooks",
    srcs = glob(["*.java"]),
    deps = [
        "@maven_distribution//:org_example_package_my_dependency"
    ],
)

而在BUILD文件中的javatests/:

java_library(
    name = "tests",
    srcs = glob(["*.java"]),
    testonly = 1,
    deps = [
        "@maven_tests//:org_example_package_my_dependency"
    ],
)

相关问题