如何让Bazel的Maven依赖不打包进部署JAR但可用于测试?
解决方案
步骤1:调整WORKSPACE依赖配置
先移除neverlink=True,正常安装依赖,确保该依赖被完整下载,同时保留编译和运行时的可用版本:
maven_install( artifacts = [ maven.artifact("org.example.package", "my-dependency", "1.0.0"), ], # 保留原有其他配置... )
步骤2:主代码BUILD目标标记仅编译依赖
在主代码的java_library或java_binary中,给该依赖添加neverlink=True属性,这样编译时会使用该依赖,但打包部署JAR时不会将其包含:
java_library( name = "main-library", srcs = glob(["src/main/java/**/*.java"]), deps = [ # 标记该依赖仅用于编译,不参与打包 Label("@maven//:org_example_package_my_dependency", neverlink = True), # 其他主代码依赖... ], )
步骤3:测试目标正常依赖该包
在java_test目标中直接依赖该包的默认版本(neverlink默认值为False),确保测试运行时能加载到依赖类:
java_test( name = "my-test", srcs = glob(["src/test/java/**/*.java"]), deps = [ ":main-library", # 正常依赖,测试运行时可访问类文件 "@maven//:org_example_package_my_dependency", # 测试框架依赖(如JUnit等)... ], )
原理说明
neverlink=True的依赖仅参与编译过程,不会被加入运行时类路径,也不会被打包进最终部署JAR,满足“不包含依赖到部署包”的需求。- 测试目标直接使用未设置
neverlink的依赖版本,运行时会自动加载该依赖的类,解决NoClassDefFoundError问题。
内容的提问来源于stack exchange,提问作者frsv
相关产品推荐
相关产品推荐

