Как добавить Maven-репозиторий по URL в build.gradle.kts с помощью Kotlin DSL
Всем привет! Я перехожу с Groovy на Kotlin DSL в Gradle и столкнулся с проблемой при добавлении внешнего Maven-репозитория.
Раньше в build.gradle я писал так:
repositories {
maven { url "https://jitpack.io" }
mavenCentral()
}
Теперь я переписываю файл на build.gradle.kts и пытаюсь сделать то же самое:
repositories {
maven { url = "https://jitpack.io" }
mavenCentral()
}
Но Gradle выдаёт ошибку:
Unresolved reference: url
Type mismatch: inferred type is String but URI was expected
Я пробовал разные варианты: url("https://jitpack.io"), maven("https://jitpack.io"), но ничего не работает правильно. Подскажите, как правильно добавить Maven-репозиторий по URL в Kotlin DSL? И почему в Groovy это было проще?
Использую Gradle 8.x, проект на Kotlin 1.9. Буду благодарен за подробное объяснение с примерами.
<<Правильный способ добавления Maven-репозитория в Kotlin DSL
Проблема в том, что в Kotlin DSL свойство url ожидает тип URI, а не String. В Groovy это работало автоматически благодаря динамической типизации. Вот несколько корректных решений:
Способ 1: Использовать uri() (рекомендуемый)
repositories {
maven {
url = uri("https://jitpack.io")
}
mavenCentral()
}
Функция uri() — это встроенная функция Kotlin DSL, которая преобразует строку в объект URI. Это самый чистый и идиоматичный способ.
Способ 2: Использовать URI() конструктор
repositories {
maven {
url = URI("https://jitpack.io")
}
mavenCentral()
}
Работает, но требует явного импорта java.net.URI.
Способ 3: Сокращённая запись (для простых случаев)
repositories {
maven("https://jitpack.io")
mavenCentral()
}
Это работает, если вам не нужно указывать дополнительные параметры (credentials, authentication и т.д.). Gradle предоставляет перегруженную функцию maven(url: Any), которая принимает строку или URI.
Почему так?
В Groovy свойства сеттеров принимают любые типы благодаря динамической природе языка. Kotlin DSL использует строгую типизацию, поэтому нужно явно указывать тип URI. Это делает код более безопасным и предсказуемым.
Дополнительные примеры
Если нужно добавить репозиторий с аутентификацией:
repositories {
maven {
url = uri("https://my-private-repo.com/releases")
credentials {
username = "user"
password = "pass"
}
authentication {
create<BasicAuthentication>()
}
}
}
Для локального репозитория:
repositories {
maven {
url = uri("file://${project.rootDir}/local-repo")
}
}
Или для Ivy-репозитория:
repositories {
ivy {
url = uri("https://ivy-repo.example.com")
patternLayout {
artifact "/[module]/[revision]/[artifact].[ext]"
}
}
}
Важные советы
- Всегда используйте
uri()— это стандартная практика в Kotlin DSL Gradle. - Не забывайте про
mavenCentral(),google()иjcenter()(хотя последний deprecated) — это встроенные функции. - Для нескольких репозиториев порядок имеет значение: Gradle ищет зависимости в порядке объявления репозиториев.
Надеюсь, теперь всё ясно! Если остались вопросы — пишите в комментариях.
<<Альтернативный подход: использование extension-функций
Если вы часто добавляете один и тот же репозиторий в разные проекты, можно создать вспомогательную функцию для упрощения кода:
// build.gradle.kts
fun RepositoryHandler.jitpack() {
maven { url = uri("https://jitpack.io") }
}
repositories {
jitpack()
mavenCentral()
}
Или ещё проще — через extension-свойство:
val RepositoryHandler.jitpack: Unit
get() {
maven { url = uri("https://jitpack.io") }
}
repositories {
jitpack
mavenCentral()
}
Для Gradle 7+ с version catalogs
В современных проектах с libs.versions.toml можно вынести URL репозитория в каталог версий:
// libs.versions.toml
[versions]
jitpack = "https://jitpack.io"
// build.gradle.kts
repositories {
maven { url = uri(libs.versions.jitpack.get()) }
}
Этот подход особенно полезен, когда репозиторий используется в многомодульных проектах — достаточно изменить URL в одном месте.
Главное преимущество — единообразие и лёгкость поддержки кода. Недостаток — небольшой оверхед на создание дополнительных функций.
Ответов пока нет.
Войдите чтобы оставить ответ