使用Bazel构建时Maven依赖Jar为空的问题求助
解决Bazel中maven_jar下载selenium-java Jar为空的问题
我之前踩过一模一样的坑!你遇到的问题根源在于**org.seleniumhq.selenium:selenium-java:3.11.0是一个聚合类型的Artifact(pom packaging)**,它本身就只包含清单文件,真正的代码和依赖逻辑都拆分在它的子模块Jar里,所以直接用原生maven_jar拉取它自然会得到空Jar。
下面给你两个亲测有效的解决方案:
方案1:直接依赖具体的子模块Jar
既然selenium-java是聚合包,你可以根据自己的需求直接引入它的子模块,比如需要Chrome驱动就拉selenium-chrome-driver,需要核心API就拉selenium-api。修改你的WORKSPACE配置如下:
maven_server( name = "default", url = "http://central.maven.org/maven2/" ) # 核心API模块 maven_jar( name = "org_seleniumhq_selenium_selenium_api", artifact = "org.seleniumhq.selenium:selenium-api:3.11.0", sha1 = "a1b2c3d4e5f6...", # 替换为该Jar对应的SHA1值 ) # Chrome驱动模块(示例,按需添加) maven_jar( name = "org_seleniumhq_selenium_selenium_chrome_driver", artifact = "org.seleniumhq.selenium:selenium-chrome-driver:3.11.0", sha1 = "xYzAbcDef...", # 替换为该Jar对应的SHA1值 ) # 其他需要的子模块,比如selenium-support、selenium-firefox-driver等
之后在BUILD文件里直接依赖这些子模块即可。
方案2:使用rules_jvm_external替代原生maven_jar
原生maven_jar对聚合包、依赖树的支持很有限,而rules_jvm_external是Bazel官方推荐的JVM依赖管理工具,能自动解析pom文件的依赖关系,帮你拉取所有需要的Jar包。
步骤1:在WORKSPACE中引入rules_jvm_external
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "rules_jvm_external", sha256 = "d6474445c97f0f077f5d360b874576901d3f49d13cc4d69b1d9499b9d90d856b", # 对应4.4版本的sha256,可按需更新 url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/4.4/rules_jvm_external-4.4.tar.gz", ) load("@rules_jvm_external//:defs.bzl", "maven_install") maven_install( artifacts = [ "org.seleniumhq.selenium:selenium-java:3.11.0", ], repositories = [ "http://central.maven.org/maven2/", ], )
步骤2:在BUILD文件中引用依赖
java_binary( name = "your_application", srcs = glob(["src/main/java/**/*.java"]), deps = [ "@maven//:org_seleniumhq_selenium_selenium_java", ], )
这样rules_jvm_external会自动解析selenium-java的pom依赖,拉取所有子模块和传递依赖的Jar包,不用你手动一个个添加。
验证方式
你可以去Maven中央仓库查看selenium-java:3.11.0的详情,它的packaging类型明确是pom,页面下方的Modules列表里就是真正包含代码的子模块Jar,这也能解释为什么你下载的Jar只有清单文件。
内容的提问来源于stack exchange,提问作者d.t.
相关产品推荐
相关产品推荐

