如何在Bazel中为Android项目添加Maven依赖项(例如Volley,Gson)?

Abh*_*mar 5 java android gson android-volley bazel

现在我正在这样

deps = [
   ":tensorflow_native_libs",
   "//tensorflow/contrib/lite/java:tensorflowlite",
   "@androidsdk//com.android.support:appcompat-v7-25.0.0",
   "@androidsdk//com.android.volley:volley:1.1.0",
   "@androidsdk//com.google.code.gson:gson:2.6.2"
],
Run Code Online (Sandbox Code Playgroud)

里面android_binary。但我收到此错误:

错误:/ home / abhi / Desktop / Git / SENA-28 / tensorflow / SenDetect / BUILD:24:1:// SenDetect:sendetect:无效标签'@ androidsdk // com.android.volley:volley:1.1.0'在“ android_binary”规则中属性“ deps”的元素3中:无效的目标名称“ volley:1.1.0”:目标名称可能不包含“:”

Jin*_*Jin 7

截至2019年4月:

更新:rules_jvm_externalBazel团队的新规则集,用于以过渡方式获取和解决工件。

在这种情况下,WORKSPACE文件将包含以下内容:

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

maven_install(
    artifacts = [
        "com.android.volley:volley:1.1.0",
        "com.google.code.gson:gson:2.6.2",
        "com.android.support:design:27.0.2",
        "com.android.support:support_annotations:jar:27.0.2",
    ],
    repositories = [
        "https://jcenter.bintray.com",
        "https://maven.google.com",
    ]
)
Run Code Online (Sandbox Code Playgroud)

然后在BUILD文件中,您可以像这样直接依赖Volley和Gson:

android_library(
    name = "my_lib",
    srcs = # ...
    deps = [
        "@maven//:com_android_volley_volley",
        "@maven//:com_google_code_gson_gson",
        "@maven//:com_android_support_design",
        "@maven//:com_android_support_support_annotations",
    ],
)
Run Code Online (Sandbox Code Playgroud)

截至2018年5月:

双方gmaven_rulesmaven_jar已被弃用。请不要再使用它们。

docs.bazel.build上的文档中,按照其他相关说明进行了编辑:

Maven中央存储库上托管的Maven依赖项

maven_jar存储库规则用于未托管在Google Maven上的Maven依赖项。例如,要使用Volley 1.1.0和Gson 2.6.2,请将以下行添加到WORKSPACE项目目录顶层的文件中:

maven_jar(
    name = "com_android_volley_volley",
    artifact = "com.android.volley:volley:1.1.0",
)

maven_jar(
    name = "com_google_code_gson",
    artifact = "com.google.code.gson:gson:2.6.2",
)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在BUILD文件中依赖它们:

android_library(
    name = "my_app_lib",
    srcs = [..],
    deps = [
        "@com_android_volley_volley//jar",
        "@com_google_code_gson//jar",
    ],
)
Run Code Online (Sandbox Code Playgroud)

请注意,maven_jar不是传递的,所以它不会下载指定的jar的依赖关系。您将需要maven_jar为传递依赖项手动指定其他规则,或使用类似工具bazel-deps来自动生成它们。

托管在Google Maven存储库(https://maven.google.com)上的Maven依赖项

对于托管在Google Maven存储库中的@gmaven_rules依赖项,gmaven_artifact通过直接指定工件坐标, 提供了一种简单的方法来获取托管的依赖项。

要使用@gmaven_rules,请将以下行添加到WORKSPACE文件中:

# Google Maven Repository
GMAVEN_TAG = "20180513-1"    
http_archive(
    name = "gmaven_rules",
    strip_prefix = "gmaven_rules-%s" % GMAVEN_TAG,
    url = "https://github.com/bazelbuild/gmaven_rules/archive/%s.tar.gz" % GMAVEN_TAG,
)
load("@gmaven_rules//:gmaven.bzl", "gmaven_rules")
gmaven_rules()
Run Code Online (Sandbox Code Playgroud)

然后,gmaven_artifact在您的BUILD文件的开头加载宏以使用它:

load("@gmaven_rules//:defs.bzl", "gmaven_artifact")

android_library(
    name = "my_app_lib",
    srcs = glob(["java/**/*.java"]),
    deps = [
        gmaven_artifact("com.android.support:design:aar:27.0.2"),
        gmaven_artifact("com.android.support:support_annotations:jar:27.0.2"),
    ]
    # ...
)
Run Code Online (Sandbox Code Playgroud)

与不同maven_jar,它gmaven_artifact 是可传递的,因此您只需指定工件的坐标即可@gmaven_rules自动解决相关性。