首页
学习
活动
专区
圈层
工具
发布

如何在Bazel中依赖测试Maven jar?

在Bazel中依赖并测试Maven管理的JAR包,需结合外部依赖管理和构建规则。以下是完整解决方案:

基础概念

Bazel通过rules_jvm_externalrules_jvm等规则支持Maven依赖,无需手动下载JAR包。测试时需确保依赖传递性正确且作用域(如test)被正确处理。

实现步骤

1. 配置WORKSPACE文件

使用rules_jvm_external拉取Maven依赖:

代码语言:txt
复制
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# 添加rules_jvm_external
http_archive(
    name = "rules_jvm_external",
    sha256 = "...", # 替换为最新版本SHA
    strip_prefix = "rules_jvm_external-4.5",
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/4.5.zip",
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = [
        "junit:junit:4.13.2",           # 测试依赖示例
        "org.mockito:mockito-core:3.12.4",
        "com.google.guava:guava:31.0.1", # 主代码依赖示例
    ],
    repositories = [
        "https://repo1.maven.org/maven2",
    ],
)

2. 定义Java库和测试目标

假设项目结构如下:

代码语言:txt
复制
project/
├── src/
│   ├── main/
│   └── test/
├── BUILD

BUILD文件示例

代码语言:txt
复制
# 主代码库(依赖Guava)
java_library(
    name = "main_lib",
    srcs = glob(["src/main/**/*.java"]),
    deps = [
        "@maven//:com_google_guava_guava",
    ],
)

# 测试目标(依赖JUnit和Mockito)
java_test(
    name = "my_test",
    srcs = glob(["src/test/**/*.java"]),
    deps = [
        ":main_lib",
        "@maven//:junit_junit",
        "@maven//:org_mockito_mockito_core",
    ],
    test_class = "com.example.MyTest", # 替换为实际测试类
)

3. 运行测试

代码语言:txt
复制
bazel test //:my_test

关键问题解决

问题1:依赖冲突

  • 原因:多个JAR包传递依赖不同版本。
  • 解决方案:在maven_install中指定版本或排除冲突:
  • 解决方案:在maven_install中指定版本或排除冲突:

问题2:测试依赖未传递

  • 原因:Bazel默认不传递testonly依赖。
  • 解决方案:显式声明测试依赖:
  • 解决方案:显式声明测试依赖:

问题3:原生Maven构建迁移

  • 原因:Bazel需显式声明所有依赖。
  • 解决方案:使用工具生成初始配置:
  • 解决方案:使用工具生成初始配置:

优势与场景

  • 优势
    • 精确依赖控制,避免隐式传递
    • 增量构建加速测试
    • 跨平台一致性
  • 场景
    • 混合Maven/Bazel的迁移期项目
    • 需要严格构建隔离的大型代码库

完整示例参考

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券