Avatar ·

Как добавить 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 в одном месте.

Главное преимущество — единообразие и лёгкость поддержки кода. Недостаток — небольшой оверхед на создание дополнительных функций.