Сборка Gradle: Сервер вернул код ответа HTTP: 401 для URL https с использованием artifactory

#android #gradle #android-gradle-plugin #artifactory

#Android #gradle #android-gradle-plugin #artifactory

Вопрос:

В build.gradle модуля я пытаюсь выполнить следующую строку

 if (!jsonFile.exists()) {
    new URL(mapUrl).withInputStream{ i -> jsonFile.withOutputStream{ it << i }}
}
  

Сборка завершается ошибкой:

 Server returned HTTP response code: 401 for URL: https://artifactory.myurl.com/artifactory/myfile.json
  

Я передаю учетные данные в свой скрипт gradle следующим образом:

 buildscript {
    repositories {
        google()
        jcenter()

        maven {
            url 'https://artifactory.myurl.com/artifactory/'
            credentials {
                username = "myuser"
                password = "mypwd"
            }
        }
    }
}
  

Ответ №1:

Ну, в вашем коде есть несколько проблем:

Во-первых, withInputStream и withOutputStream являются улучшениями Groovy JDK для классов Java URL и File . Это не связано с какой-либо функциональностью Gradle и работает только потому, что Gradle построен поверх Groovy. Насколько я знаю, невозможно передать учетные данные withInputStream , поэтому он работает только для общедоступных ресурсов.

Что касается второй части вашего фрагмента кода, давайте сначала взглянем на buildscript блок. Это специальный блок Gradle, который всегда будет оцениваться первым (и должен находиться в верхней части build.gradle файла). Причина этого в том, что этот блок в основном предоставляет настройки для вашего сценария сборки (он же build.gradle файл). Обычно этот блок определяет, repositories и dependencies которые необходимо разрешить для работы сценария сборки (например, плагины). Обычный проект dependencies и их repositories могут быть определены вне buildscript блока. Они разрешаются, когда они нужны другим задачам (например, задачам компиляции).

 buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'example-plugins:my-fancy-plugin:0.0.1'
    }
}
// the build script stops here to resolve my-fancy-plugin from jcenter

repositories {
    jcenter()
}

dependencies {
    implementation 'example-libraries:my-cool-library:0.0.1'
}
// this won't be resolved directly, only if a task that needs *implementation* dependencies is run
  

Механизм repositories / dependencies в основном используется для разрешения *.jar файлов, которые служат зависимостями проектов на основе JVM. Репозитории обычно являются репозиториями Maven. Репозитории Maven соответствуют определенному макету, поэтому дескрипторы зависимостей (например, example-libraries:my-cool-library:0.0.1 ) будут сопоставлены с URL (например, example/libraries/my-cool-library/0.0.1/my-cool-library-0.0.1.jar ). Затем Gradle пытается загрузить зависимости с этого URL. Поскольку ваш путь не соответствует макету репозитория Maven, вы не можете загрузить свой файл из репозитория Maven.

Для вашего варианта использования вам, вероятно, вообще не следует использовать разрешение зависимости Gradle. Существует плагин, который позволяет загружать файлы с помощью задачи Gradle (с поддержкой аутентификации):

 task downloadFile(type: Download) {
    src 'https://artifactory.myurl.com/artifactory/myfile.json'
    username = "myuser"
    password = "mypwd"
    dest buildDir
}
  

В качестве альтернативы вы можете определить репозиторий Ivy с пользовательским макетом репозитория.

Комментарии:

1. Это имеет смысл. Я попробую загрузить плагин gradle для передачи учетных данных. Спасибо!