#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 для передачи учетных данных. Спасибо!