如何在Android项目的Bazel中添加Volley、Gson等Maven依赖?
首先看你碰到的错误:
ERROR: /home/abhi/Desktop/Git/SENA-28/tensorflow/SenDetect/BUILD:24:1: //SenDetect:sendetect: invalid label '@androidsdk//com.android.volley:volley:1.1.0' in element 3 of attribute 'deps' in 'android_binary' rule: invalid target name 'volley:1.1.0': target names may not contain ':'
问题出在你把版本号1.1.0直接放在了依赖标签的目标名称部分,Bazel的目标标签格式是@<仓库名>//<包路径>:<目标名>,目标名里绝对不能包含冒号,这才触发了报错。
下面是具体的修复步骤:
1. 修正BUILD文件中的deps依赖标签
把deps里每个依赖的版本号去掉,只保留组和artifact名称,格式调整为@androidsdk//<group>:<artifact>:
deps = [ ":tensorflow_native_libs", "//tensorflow/contrib/lite/java:tensorflowlite", "@androidsdk//com.android.support:appcompat-v7", "@androidsdk//com.android.volley:volley", "@androidsdk//com.google.code.gson:gson" ],
2. 在WORKSPACE文件中指定依赖版本
版本号需要统一在WORKSPACE里配置,而不是散落在BUILD文件中。这里分两种常用的配置方式:
方式一:使用android_sdk_repository
如果你是通过android_sdk_repository管理Android相关依赖,直接在该规则的maven_artifacts参数里声明带版本的依赖:
android_sdk_repository( name = "androidsdk", api_level = 25, build_tools_version = "25.0.0", maven_artifacts = [ "com.android.support:appcompat-v7:25.0.0", "com.android.volley:volley:1.1.0", "com.google.code.gson:gson:2.6.2", ], )
方式二:使用maven_install(推荐)
如果你的项目依赖较多Maven库,更推荐用maven_install规则来统一管理,配置如下:
load("@bazel_tools//tools/build_defs/repo:maven.bzl", "maven_install") maven_install( name = "maven", artifacts = [ "com.android.support:appcompat-v7:25.0.0", "com.android.volley:volley:1.1.0", "com.google.code.gson:gson:2.6.2", ], repositories = [ "https://maven.google.com", "https://repo1.maven.org/maven2", ], )
这种情况下,BUILD文件里的deps引用需要改成以下格式(把点和横杠替换成下划线):
deps = [ ":tensorflow_native_libs", "//tensorflow/contrib/lite/java:tensorflowlite", "@maven//:com_android_support_appcompat_v7", "@maven//:com_android_volley_volley", "@maven//:com_google_code_gson_gson" ],
小提示
Bazel的依赖标签规则很严格,记住版本号永远不要放在BUILD的deps标签里,统一在WORKSPACE管理不仅能避免格式错误,还方便后续统一升级依赖版本。
内容的提问来源于stack exchange,提问作者Abhijeet Kumar

