Как добавить зависимости Maven (например, Volley, Gson) в Bazel для проекта Android?

Прямо сейчас я делаю вот так

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. Но я получаю эту ошибку:

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 ':'

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
1 837
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По состоянию на апрель 2019 г .:

Обновление: 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 г .:

И gmaven_rules, и maven_jar устарели. Пожалуйста, не используйте их больше.

Из документации на docs.bazel.build, отредактированной с дополнительными соответствующими инструкциями:

Зависимости Maven, размещенные в центральном репозитории Maven

Use the maven_jar repository rule for Maven dependencies not hosted on Google Maven. For example, to use Volley 1.1.0 and Gson 2.6.2, add the following lines to the WORKSPACE file at the top level of the project directory:

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

Then, you can depend on them in your BUILD files:

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, для их автоматического создания.

Зависимости Maven, размещенные в репозитории Google Maven (https://maven.google.com)

For dependencies hosted on Google's Maven repository, @gmaven_rules provides a simple way to fetch dependencies hosted with gmaven_artifact by specifying the artifact coordinate directly.

To use @gmaven_rules, add these lines to the WORKSPACE file:

# 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()

Then, load the gmaven_artifact macro at the beginning of your BUILD file to use it:

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_jar, gmaven_artifactявляется транзитивен, поэтому вам нужно только указать координату артефакта, и @gmaven_rules автоматически разрешит зависимости.

Большое спасибо. Ты палочка-выручалочка :)

Abhijeet Kumar 30.05.2018 02:36

@Jin Я получаю ошибку Failed to load Starlark extension '@rules_jvm_external//:defs.bzl'. с bazel 0.25. Что мне не хватает?

expert 25.11.2019 17:28

@expert Пожалуйста, откройте проблему в репозитории rules_jvm_external GitHub с более подробной информацией.

Jin 25.11.2019 17:40

Как мне использовать библиотеку в моем файле .java? там написано not found

Rami Alloush 09.03.2020 19:06

Другие вопросы по теме