【问题标题】:How to add Maven dependencies (e.g. Volley, Gson) in Bazel for an Android project?如何在 Bazel 中为 Android 项目添加 Maven 依赖项(例如 Volley、Gson)?
【发布时间】:2018-11-08 04:13:42
【问题描述】:

我现在就是这样

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"
],

android_binary 内。但是我收到了这个错误:

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

【问题讨论】:

    标签: java android gson android-volley bazel


    【解决方案1】:

    截至 2019 年 4 月:

    更新:rules_jvm_external 是 Bazel 团队的新规则集,用于以传递方式获取和解析工件。

    在这种情况下,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",
        ]
    )
    

    然后在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",
        ],
    )
    

    截至 2018 年 5 月:

    gmaven_rulesmaven_jar 均已弃用。请不要再使用它们了。

    来自docs.bazel.build 上的文档,并添加了相关说明:

    Maven Central Repository 上托管的 Maven 依赖项

    对未托管的 Maven 依赖项使用 maven_jar 存储库规则 谷歌马文。例如,要使用 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",
    )
    

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

    android_library(
        name = "my_app_lib",
        srcs = [..],
        deps = [
            "@com_android_volley_volley//jar",
            "@com_google_code_gson//jar",
        ],
    )
    

    注意maven_jar传递的,所以它不会下载指定jar的依赖。您需要手动为传递依赖项指定额外的maven_jar 规则,或使用bazel-deps 等工具自动生成它们。

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

    对于托管在Google's Maven repository 上的依赖项, @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()
    

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

    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"),
        ]
        # ...
    )
    

    不同于maven_jargmaven_artifact传递性的,所以你只需要指定工件的坐标,@gmaven_rules会自动解析依赖。

    【讨论】:

    • 非常感谢。你是救生员:)
    • @Jin 我收到Failed to load Starlark extension '@rules_jvm_external//:defs.bzl'. bazel 0.25 错误。我错过了什么?
    • @expert 请在 rules_jvm_external GitHub 存储库上打开一个问题并提供更多详细信息。
    • 如何使用我的.java 文件中的库?它说not found
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多