Spec-Zone.ru › Kotlin 2

Настройка проекта Gradle

Чтобы собрать проект Kotlin с помощью Gradle, необходимо добавить плагин Kotlin Gradle в файл сценария сборки build.gradle(.kts) и настроить зависимости проекта в нём.

Подробнее о содержимом сценария сборки см. в разделе Изучение сценария сборки.

Применение плагина

Чтобы применить плагин Kotlin Gradle, используйте блок plugins{} из DSL плагинов Gradle:

plugins {
    // Replace `<...>` with the plugin name appropriate for your target environment
    kotlin("<...>") version "2.4.20"
    // For example, if your target environment is JVM:
    // kotlin("jvm") version "2.4.20"
}
plugins {
    // Replace `<...>` with the plugin name appropriate for your target environment
    id 'org.jetbrains.kotlin.<...>' version '2.4.20'
    // For example, if your target environment is JVM: 
    // id 'org.jetbrains.kotlin.jvm' version '2.4.20'
}

Нумерация версий плагина Kotlin Gradle (KGP) и Kotlin совпадает.

При настройке проекта проверьте совместимость плагина Kotlin Gradle (KGP) с доступными версиями Gradle. В следующей таблице указаны минимальные и максимальные полностью поддерживаемые версии Gradle и плагина Android Gradle (AGP):

Версия KGP

Минимальная и максимальная версии Gradle

Минимальная и максимальная версии AGP

2.4.20

7.6.3–9.7.0

8.5.2–9.3.1

2.4.0-2.4.10

7.6.3–9.5.0

8.5.2–9.1.0

2.3.20–2.3.21

7.6.3–9.3.0

8.2.2–9.0.0

2.3.10

7.6.3–9.0.0

8.2.2–9.0.0

2.3.0

7.6.3–9.0.0

8.2.2–8.13.0

2.2.20–2.2.21

7.6.3–8.14

7.3.1–8.11.1

2.2.0–2.2.10

7.6.3–8.14

7.3.1–8.10.0

2.1.20–2.1.21

7.6.3–8.12.1

7.3.1–8.7.2

2.1.0–2.1.10

7.6.3–8.10*

7.3.1–8.7.2

2.0.20–2.0.21

6.8.3–8.8*

7.1.3–8.5

2.0.0

6.8.3–8.5

7.1.3–8.3.1

1.9.20–1.9.25

6.8.3–8.1.1

4.2.2–8.1.0

*Kotlin 2.0.20–2.0.21 и Kotlin 2.1.0–2.1.10 полностью совместимы с Gradle вплоть до версии 8.6. Версии Gradle 8.7–8.10 также поддерживаются, за одним исключением: если вы используете плагин Kotlin Multiplatform Gradle, в многоплатформенных проектах могут появиться предупреждения об устаревании при вызове функции withJava() в целевой платформе JVM. Подробнее см. в разделе Наборы исходного кода Java, создаваемые по умолчанию.

Также можно использовать последние выпуски Gradle и AGP, однако в этом случае могут появиться предупреждения об устаревании или некоторые новые функции могут работать некорректно.

Например, для компиляции проекта плагину Kotlin Gradle и плагину kotlin-multiplatform версии 2.4.20 требуется Gradle версии не ниже 7.6.3.

Аналогично, максимальная полностью поддерживаемая версия — 9.7.0. В ней нет устаревших методов и свойств Gradle, и она поддерживает все текущие функции Gradle.

Предыдущие версии KGP

Версия KGP

Минимальная и максимальная версии Gradle

Минимальная и максимальная версии AGP

1.9.0–1.9.10

6.8.3–7.6.0

4.2.2–7.4.0

1.8.20–1.8.22

6.8.3–7.6.0

4.1.3–7.4.0

1.8.0–1.8.11

6.8.3–7.3.3

4.1.3–7.2.1

1.7.20–1.7.22

6.7.1–7.1.1

3.6.4–7.0.4

1.7.0–1.7.10

6.7.1–7.0.2

3.4.3–7.0.2

1.6.20–1.6.21

6.1.1–7.0.2

3.4.3–7.0.2

Данные плагина Kotlin Gradle в проекте

По умолчанию плагин Kotlin Gradle сохраняет постоянные данные проекта в корневой папке проекта, в каталоге .kotlin.

Не добавляйте каталог .kotlin в систему контроля версий. Например, если вы используете Git, добавьте .kotlin в файл .gitignore вашего проекта.

В файл gradle.properties проекта можно добавить свойства, чтобы настроить это поведение:

Свойство Gradle

Описание

kotlin.project.persistent.dir

Задаёт расположение для хранения данных на уровне проекта. По умолчанию: <project-root-directory>/.kotlin

kotlin.project.persistent.dir.gradle.disableWrite

Управляет тем, отключена ли запись данных Kotlin в каталог .gradle (для обратной совместимости со старыми версиями IDEA). По умолчанию: false

Настройка целевой платформы JVM

Чтобы настроить целевую платформу JVM, примените плагин Kotlin JVM.

plugins {
    kotlin("jvm") version "2.4.20"
}
plugins {
    id "org.jetbrains.kotlin.jvm" version "2.4.20"
}

Значение version в этом блоке должно быть указано напрямую; применить его из другого сценария сборки нельзя.

Исходный код Kotlin и Java

Исходный код Kotlin и Java можно хранить в одном каталоге или размещать в разных каталогах.

По умолчанию используются разные каталоги:

project
    - src
        - main (root)
            - kotlin
            - java

Не храните файлы Java .java в каталоге src/*/kotlin, так как файлы .java не будут скомпилированы.

Вместо этого можно использовать src/main/java.

Если вы не используете соглашение по умолчанию, необходимо обновить соответствующее свойство sourceSets:

sourceSets.main {
    java.srcDirs("src/main/myJava", "src/main/myKotlin")
}
sourceSets {
    main.kotlin.srcDirs += 'src/main/myKotlin'
    main.java.srcDirs += 'src/main/myJava'
}

Проверка совместимости целевых платформ JVM связанных задач компиляции

В модуле сборки могут быть связанные задачи компиляции, например:

  • compileKotlin и compileJava

  • compileTestKotlin и compileTestJava

Задачи компиляции наборов исходного кода main и test не связаны.

Для таких связанных задач плагин Kotlin Gradle проверяет совместимость целевых платформ JVM. Разные значения атрибута jvmTarget в расширении или задаче kotlin и атрибута targetCompatibility в расширении или задаче java приводят к несовместимости целевых платформ JVM. Например, у задачи compileKotlin указано значение jvmTarget=1.8, а у задачи compileJava указано (или унаследовано) значение targetCompatibility=15.

Настройте поведение этой проверки для всего проекта, указав в файле gradle.properties свойство kotlin.jvm.target.validation.mode со значением:

  • error — плагин завершает сборку с ошибкой; значение по умолчанию для проектов на Gradle 8.0 и выше.

  • warning — плагин выводит предупреждение; значение по умолчанию для проектов на версиях Gradle ниже 8.0.

  • ignore — плагин пропускает проверку и не выводит никаких сообщений.

Также можно настроить это на уровне задачи в файле build.gradle(.kts):

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>().configureEach {
    jvmTargetValidationMode.set(org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.WARNING)
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile.class).configureEach {
    jvmTargetValidationMode = org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.WARNING
}

Чтобы избежать несовместимости целевых платформ JVM, настройте цепочку инструментов или вручную согласуйте версии JVM.

Что может пойти не так при несовместимости целевых платформ

Существует два способа вручную задать целевые платформы JVM для наборов исходного кода Kotlin и Java:

  • Неявный способ — настройка цепочки инструментов Java.

  • Явный способ — задать атрибут jvmTarget в расширении или задаче kotlin и targetCompatibility в расширении или задаче java.

Несовместимость целевых платформ JVM возникает в следующих случаях:

  • Явно заданы разные значения jvmTarget и targetCompatibility.

  • Используется конфигурация по умолчанию, а версия JDK не равна 1.8.

Рассмотрим конфигурацию целевых платформ JVM по умолчанию, если в сценарии сборки используется только плагин Kotlin JVM и не заданы дополнительные параметры целевых платформ JVM:

plugins {
    kotlin("jvm") version "2.4.20"
}
plugins {
    id "org.jetbrains.kotlin.jvm" version "2.4.20"
}

Если в сценарии сборки явно не указано значение jvmTarget, по умолчанию используется null, а компилятор преобразует его в значение по умолчанию 1.8. Значение targetCompatibility соответствует текущей версии JDK Gradle, которая совпадает с версией вашей JDK (если только вы не используете цепочку инструментов Java). Если предположить, что используется JDK версии 17, опубликованный артефакт библиотеки будет объявлять совместимость с JDK 17 и выше: org.gradle.jvm.version=17, что неверно. В этом случае для добавления этой библиотеки потребуется использовать Java 17 в основном проекте, несмотря на то, что версия байт-кода — 1.8. Чтобы решить эту проблему, настройте цепочку инструментов.

Поддержка цепочек инструментов Java в Gradle

Предупреждение для пользователей Android. Чтобы использовать поддержку цепочек инструментов Gradle, необходима версия плагина Android Gradle (AGP) 8.1.0-alpha09 или выше.

Поддержка цепочек инструментов Java в Gradle доступна начиная с AGP 7.4.0. Однако из-за этой проблемы AGP не задавал targetCompatibility в соответствии с JDK цепочки инструментов вплоть до версии 8.1.0-alpha09. Если вы используете версию ниже 8.1.0-alpha09, необходимо настроить targetCompatibility вручную с помощью compileOptions. Замените заполнитель <MAJOR_JDK_VERSION> на версию JDK, которую хотите использовать:

android {
    compileOptions {
        sourceCompatibility = <MAJOR_JDK_VERSION>
        targetCompatibility = <MAJOR_JDK_VERSION>
    }
}

В Gradle 6.7 появилась поддержка цепочек инструментов Java. Эта функция позволяет:

  • Использовать для компиляции, тестирования и запуска исполняемых файлов JDK и JRE, отличные от используемых Gradle.

  • Компилировать и тестировать код с помощью ещё не выпущенной версии языка.

При поддержке цепочек инструментов Gradle может автоматически обнаруживать локальные JDK и устанавливать отсутствующие JDK, необходимые для сборки. Теперь сам Gradle может работать на любой JDK и при этом повторно использовать функцию удалённого кэша сборки для задач, зависящих от основной версии JDK.

Плагин Kotlin Gradle поддерживает цепочки инструментов Java для задач компиляции Kotlin/JVM. Задачи JS и Native не используют цепочки инструментов. Компилятор Kotlin всегда работает на той JDK, на которой запущен демон Gradle. Цепочка инструментов Java:

  • Задаёт параметр -jdk-home, доступный для целевых платформ JVM.

  • Если пользователь явно не задаёт параметр jvmTarget, устанавливает для compilerOptions.jvmTarget версию JDK из цепочки инструментов. Если пользователь не настраивает цепочку инструментов, для поля jvmTarget используется значение по умолчанию. Подробнее см. в разделе Совместимость целевых платформ JVM.

  • Задаёт цепочку инструментов для всех задач компиляции Java, тестирования и javadoc.

  • Влияет на JDK, в которой работают рабочие процессы kapt.

Чтобы задать цепочку инструментов, используйте следующий код. Замените заполнитель <MAJOR_JDK_VERSION> на версию JDK, которую хотите использовать:

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
    }
    // Or shorter:
    jvmToolchain(<MAJOR_JDK_VERSION>)
    // For example:
    jvmToolchain(17)
}
kotlin {
    jvmToolchain {
        languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
    }
    // Or shorter:
    jvmToolchain(<MAJOR_JDK_VERSION>)
    // For example:
    jvmToolchain(17)
}

Обратите внимание, что настройка цепочки инструментов через расширение kotlin также обновляет цепочку инструментов для задач компиляции Java.

Цепочку инструментов можно задать через расширение java, после чего задачи компиляции Kotlin будут её использовать:

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) 
    }
}
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
    }
}

Если вы используете Gradle 8.0.2 или выше, необходимо также добавить плагин для разрешения цепочки инструментов. Плагин этого типа управляет выбором репозитория для загрузки цепочки инструментов. Например, добавьте следующий плагин в файл settings.gradle(.kts):

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version("1.0.0")
}
plugins {
    id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
}

Убедитесь, что версия foojay-resolver-convention соответствует вашей версии Gradle. Сведения о версиях см. на сайте Gradle.

Чтобы узнать, какую цепочку инструментов использует Gradle, запустите сборку Gradle с уровнем журнала --info и найдите в выводе строку, начинающуюся с [KOTLIN] Kotlin compilation 'jdkHome' argument:. Часть после двоеточия будет содержать версию JDK из цепочки инструментов.

Чтобы задать любую JDK (в том числе локальную) для конкретной задачи, используйте DSL задач.

Подробнее о поддержке цепочек инструментов JVM в Gradle в плагине Kotlin.

Задание версии JDK с помощью DSL задач

DSL задач позволяет задать любую версию JDK для любой задачи, реализующей интерфейс UsesKotlinJavaToolchain. На данный момент к таким задачам относятся KotlinCompile и KaptTask. Если вы хотите, чтобы Gradle выполнил поиск основной версии JDK, замените заполнитель <MAJOR_JDK_VERSION> в сценарии сборки:

val service = project.extensions.getByType<JavaToolchainService>()
val customLauncher = service.launcherFor {
    languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
project.tasks.withType<UsesKotlinJavaToolchain>().configureEach {
    kotlinJavaToolchain.toolchain.use(customLauncher)
}
JavaToolchainService service = project.getExtensions().getByType(JavaToolchainService.class)
Provider<JavaLauncher> customLauncher = service.launcherFor {
    it.languageVersion = JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
}
tasks.withType(UsesKotlinJavaToolchain::class).configureEach { task ->
    task.kotlinJavaToolchain.toolchain.use(customLauncher)
}

Либо можно указать путь к локальной JDK и заменить заполнитель <LOCAL_JDK_VERSION> на версию этой JDK:

tasks.withType<UsesKotlinJavaToolchain>().configureEach {
    kotlinJavaToolchain.jdk.use(
        "/path/to/local/jdk", // Put a path to your JDK
        JavaVersion.<LOCAL_JDK_VERSION> // For example, JavaVersion.17
    )
}

Связывание задач компилятора

Можно связать компиляции, установив между ними такую зависимость, при которой одна компиляция использует результаты компиляции другой. Связывание компиляций обеспечивает между ними видимость internal.

Компилятор Kotlin по умолчанию связывает некоторые компиляции, например компиляции test и main каждой целевой платформы. Если необходимо указать, что одна из пользовательских компиляций связана с другой, создайте собственную связанную компиляцию.

Чтобы среда IDE поддерживала связанные компиляции при определении видимости между наборами исходного кода, добавьте следующий код в файл build.gradle(.kts):

val integrationTestCompilation = kotlin.target.compilations.create("integrationTest") {
    associateWith(kotlin.target.compilations.getByName("main"))
}
integrationTestCompilation {
    kotlin.target.compilations.create("integrationTest") {
        associateWith(kotlin.target.compilations.getByName("main"))
    }
}

В этом примере компиляция integrationTest связана с компиляцией main, что обеспечивает доступ к объектам internal из функциональных тестов.

Настройка с включённой поддержкой модулей Java (JPMS)

Чтобы плагин Kotlin Gradle работал с модулями Java, добавьте следующие строки в сценарий сборки и замените YOUR_MODULE_NAME ссылкой на ваш модуль JPMS, например org.company.module:

tasks.named("compileJava", JavaCompile::class.java) {
    // Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
    val mainOutput: FileCollection = sourceSets["main"].output
    options.compilerArgumentProviders.add(CommandLineArgumentProvider {
        listOf("--patch-module", "YOUR_MODULE_NAME=${mainOutput.asPath}")
    })
}
tasks.named("compileJava", JavaCompile.class) {
    // Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
    FileCollection mainOutput = sourceSets["main"].output
    options.compilerArgumentProviders.add(new CommandLineArgumentProvider() {
        @Override
        Iterable<String> asArguments() {
            return ["--patch-module", "YOUR_MODULE_NAME=${mainOutput.asPath}"]
        }
    })
}

Как обычно, поместите module-info.java в каталог src/main/java.

Для модуля имя пакета в файлах Kotlin должно совпадать с именем пакета из module-info.java, чтобы сборка не завершилась с ошибкой «пакет пуст или не существует».

Подробнее:

  • Сборка модулей для системы модулей Java

  • Создание приложений с использованием системы модулей Java

  • Что означает «модуль» в Kotlin

Другие сведения

Отключение использования артефакта в задаче компиляции

В некоторых редких случаях сборка может завершиться ошибкой из-за циклической зависимости. Например, когда у вас есть несколько компиляций, одна из которых видит все внутренние объявления другой, а созданный артефакт зависит от результатов обеих задач компиляции:

FAILURE: Build failed with an exception.

What went wrong:
Circular dependency between the following tasks:
:lib:compileKotlinJvm
--- :lib:jvmJar
     \--- :lib:compileKotlinJvm (*)
(*) - details omitted (listed previously)

Чтобы устранить эту ошибку циклической зависимости, мы добавили свойство Gradle: archivesTaskOutputAsFriendModule. Это свойство управляет использованием входных артефактов в задаче компиляции и определяет, будет ли в результате создана зависимость между задачами.

По умолчанию для этого свойства задано значение true, чтобы отслеживать зависимость между задачами. Если вы столкнулись с ошибкой циклической зависимости, можно отключить использование артефакта в задаче компиляции, чтобы удалить зависимость между задачами и избежать ошибки.

Чтобы отключить использование артефакта в задаче компиляции, добавьте следующее в файл gradle.properties:

kotlin.build.archivesTaskOutputAsFriendModule=false

Отложенное создание задач Kotlin/JVM

Начиная с Kotlin 1.8.20 плагин Kotlin Gradle регистрирует все задачи и не настраивает их при пробном запуске.

Нестандартное расположение destinationDirectory задач компиляции

Если вы переопределяете расположение destinationDirectory задачи KotlinJvmCompile/KotlinCompile Kotlin/JVM, обновите сценарий сборки. Необходимо явно добавить sourceSets.main.kotlin.classesDirectories в sourceSets.main.outputs в JAR-файл:

tasks.jar(type: Jar) {
    from sourceSets.main.outputs
    from sourceSets.main.kotlin.classesDirectories
}

Настройка нескольких целевых платформ

Для проектов, предназначенных для нескольких платформ и называемых многоплатформенными проектами, требуется плагин kotlin-multiplatform.

Плагин kotlin-multiplatform работает с Gradle 7.6.3 и более поздними версиями.

plugins {
    kotlin("multiplatform") version "2.4.20"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '2.4.20'
}

Подробнее о Kotlin Multiplatform для разных платформ и Kotlin Multiplatform для iOS и Android.

Настройка целевой платформы Android

Для создания приложений Android рекомендуется использовать Android Studio. Узнайте, как использовать плагин Android Gradle.

Настройка целевой платформы для веб-разработки

Kotlin предлагает два подхода к веб-разработке с помощью Kotlin Multiplatform:

  • На основе JavaScript (с использованием компилятора Kotlin/JS)

  • На основе WebAssembly (с использованием компилятора Kotlin/Wasm)

Оба подхода используют плагин Kotlin Multiplatform, но предназначены для разных сценариев. В следующих разделах объясняется, как настроить каждую целевую платформу в сборке Gradle и когда ее использовать.

Настройка целевой платформы JavaScript

Используйте Kotlin/JS, если хотите:

  • Совместно использовать бизнес-логику с кодовой базой JavaScript/TypeScript

  • Создавать на Kotlin веб-приложения, код которых нельзя совместно использовать

Дополнительную информацию см. в разделе Веб-разработка.

При настройке целевой платформы JavaScript используйте плагин kotlin-multiplatform:

plugins {
    kotlin("multiplatform") version "2.4.20"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '2.4.20'
}

Настройте целевую платформу JavaScript, указав, должна ли она работать в браузере или среде Node.js:

kotlin {
    js().browser {  // or js().nodejs
        /* ... */
    }
}

См. подробную информацию о настройке Gradle для JavaScript, а также узнайте больше о настройке проекта Kotlin/JS.

Настройка целевой платформы WebAssembly

Используйте Kotlin/Wasm, если хотите совместно использовать логику и пользовательский интерфейс на нескольких платформах. Дополнительную информацию см. в разделе Веб-разработка.

Как и в случае с JavaScript, при настройке целевой платформы WebAssembly (Wasm) используйте плагин kotlin-multiplatform:

plugins {
    kotlin("multiplatform") version "2.4.20"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '2.4.20'
}

В зависимости от ваших требований можно настроить целевую платформу:

  • wasmJs: для запуска в браузерах или Node.js

  • wasmWasi: для запуска в средах Wasm с поддержкой WASI (WebAssembly System Interface), таких как Wasmtime, WasmEdge и других.

Настройте целевую платформу wasmJs для веб-браузеров или Node.js:

kotlin {
    wasmJs {
        browser { // or nodejs
            /* ... */
        }
    }
}

Для сред WASI настройте целевую платформу wasmWasi с Node.js или Wasmtime:

kotlin {
    wasmWasi {
        nodejs { // or wasmtime
            /* ... */
        }
    }
}

См. подробную информацию о настройке Gradle для Wasm.

Исходный код Kotlin и Java для целевой веб-платформы

KGP работает только с файлами Kotlin, поэтому рекомендуется хранить файлы Kotlin и Java отдельно (если проект содержит файлы Java). Если они хранятся вместе, укажите папку с исходным кодом в блоке sourceSets{}:

kotlin {
    sourceSets["main"].apply {
        kotlin.srcDir("src/main/myKotlin")
    }
}
kotlin {
    sourceSets {
        main.kotlin.srcDirs += 'src/main/myKotlin'
    }
}

Запуск действий настройки с помощью интерфейса KotlinBasePlugin

Чтобы запускать действие настройки при применении любого плагина Kotlin Gradle (JVM, JS, Multiplatform, Native и других), используйте интерфейс KotlinBasePlugin, от которого наследуются все плагины Kotlin:

import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin

// ...

project.plugins.withType<KotlinBasePlugin>() {
    // Configure your action here
}
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin

// ...

project.plugins.withType(KotlinBasePlugin.class) {
    // Configure your action here
}

Настройка зависимостей

Чтобы добавить зависимость от библиотеки, укажите зависимость нужного типа (например, implementation) в блоке dependencies{} DSL наборов исходного кода.

kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("com.example:my-library:1.0")
        }
    }
}
kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation 'com.example:my-library:1.0'
            }
        }
    }
}

Настройка зависимостей на верхнем уровне

В мультиплатформенных проектах можно настраивать общие зависимости с помощью блока dependencies {} верхнего уровня. Объявленные здесь зависимости действуют так, как если бы они были добавлены в наборы исходного кода commonMain или commonTest.

Чтобы использовать блок dependencies {} верхнего уровня, разрешите его использование, добавив аннотацию @OptIn(ExperimentalKotlinGradlePluginApi::class) перед блоком:

kotlin {
    @OptIn(ExperimentalKotlinGradlePluginApi::class)
    dependencies {
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")
    }
}
kotlin {
    dependencies {
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0'
    }
}

Добавьте зависимости для конкретной платформы в блок sourceSets {} соответствующей целевой платформы.

Оставить отзыв об этой функции можно в YouTrack.

Типы зависимостей

Выберите тип зависимости в соответствии с вашими требованиями.

Тип

Описание

Когда использовать

api

Используется как при компиляции, так и во время выполнения и экспортируется для пользователей библиотеки.

Если в общедоступном API текущего модуля используется какой-либо тип из зависимости, используйте зависимость api.

implementation

Используется при компиляции и во время выполнения текущего модуля, но не предоставляется для компиляции других модулей, зависящих от модуля с зависимостью `implementation`.

Используйте для зависимостей, необходимых внутренней логике модуля.

Если модуль — это конечное приложение, которое не публикуется, используйте зависимости implementation вместо зависимостей api.

compileOnly

Используется при компиляции текущего модуля и недоступен во время выполнения и при компиляции других модулей.

Используйте для API, у которых есть сторонняя реализация, доступная во время выполнения.

runtimeOnly

Доступен во время выполнения, но не виден при компиляции какого-либо модуля.

Зависимость от стандартной библиотеки

Зависимость от стандартной библиотеки (stdlib) автоматически добавляется в каждый набор исходного кода. Используется та же версия стандартной библиотеки, что и версия плагина Kotlin Gradle.

Для наборов исходного кода конкретных платформ используется соответствующий вариант библиотеки для этой платформы, а для остальных добавляется общая стандартная библиотека. Плагин Kotlin Gradle выбирает подходящую стандартную библиотеку JVM в зависимости от параметра compilerOptions.jvmTarget компилятора в сценарии сборки Gradle.

Если вы явно объявите зависимость от стандартной библиотеки (например, если вам нужна другая версия), плагин Kotlin Gradle не переопределит ее и не добавит вторую стандартную библиотеку.

Если стандартная библиотека вам не нужна, добавьте в файл gradle.properties следующее свойство Gradle:

kotlin.stdlib.default.dependency=false

Согласование версий транзитивных зависимостей

Начиная с версии 1.9.20 стандартной библиотеки Kotlin, Gradle использует метаданные, включенные в стандартную библиотеку, чтобы автоматически согласовывать версии транзитивных зависимостей kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8.

Если добавить зависимость от стандартной библиотеки Kotlin версии от 1.8.0 до 1.9.10, например: implementation("org.jetbrains.kotlin:kotlin-stdlib:1.8.0"), плагин Kotlin Gradle использует эту версию Kotlin для транзитивных зависимостей kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8. Это предотвращает дублирование классов из разных версий стандартной библиотеки. Подробнее об объединении kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8 в kotlin-stdlib. Это поведение можно отключить с помощью свойства Gradle kotlin.stdlib.jdk.variants.version.alignment в файле gradle.properties:

kotlin.stdlib.jdk.variants.version.alignment=false
Другие способы согласования версий
  • Если у вас возникли проблемы с согласованием версий, можно согласовать все версии с помощью BOM Kotlin. Объявите зависимость от платформы kotlin-bom в сценарии сборки:

    implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.4.20"))
    
    implementation platform('org.jetbrains.kotlin:kotlin-bom:2.4.20')
    
  • Если вы не добавляли зависимость от определенной версии стандартной библиотеки, но у вас есть две разные зависимости, которые транзитивно добавляют разные старые версии стандартной библиотеки Kotlin, можно явно потребовать версии 2.4.20 этих транзитивных библиотек:

    dependencies {
        constraints {
            add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") {
                version {
                    require("2.4.20")
                }
            }
            add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
                version {
                    require("2.4.20")
                }
            }
        }
    }
    
    dependencies {
        constraints {
            add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk7") {
                version {
                    require("2.4.20")
                }
            }
            add("implementation", "org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
                version {
                    require("2.4.20")
                }
            }
        }
    }
    
  • Если вы добавили зависимость от стандартной библиотеки Kotlin версии 2.4.20: implementation("org.jetbrains.kotlin:kotlin-stdlib:2.4.20"), а используете старую версию плагина Kotlin Gradle (ниже 1.8.0), обновите плагин Kotlin Gradle до версии стандартной библиотеки:

    plugins {
        // replace `<...>` with the plugin name
        kotlin("<...>") version "2.4.20"
    }
    
    plugins {
        // replace `<...>` with the plugin name
        id "org.jetbrains.kotlin.<...>" version "2.4.20"
    }
    
  • Если вы используете версии 1.8.0 kotlin-stdlib-jdk7/kotlin-stdlib-jdk8, например implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:SOME_OLD_KOTLIN_VERSION"), и зависимость, транзитивно добавляющую kotlin-stdlib:1.8+, замените kotlin-stdlib-jdk<7/8>:SOME_OLD_KOTLIN_VERSION на kotlin-stdlib-jdk*:2.4.20 или исключите транзитивный kotlin-stdlib:1.8+ из библиотеки, которая его добавляет:

    dependencies {
        implementation("com.example:lib:1.0") {
            exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
        }
    }
    
    dependencies {
        implementation("com.example:lib:1.0") {
            exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib"
        }
    }
    

Добавление зависимостей от библиотек для тестирования

API kotlin.test доступен для тестирования проектов Kotlin на всех поддерживаемых платформах. Добавьте зависимость kotlin-test в набор исходного кода commonTest, чтобы плагин Gradle мог определить соответствующие зависимости для тестов в каждом наборе исходного кода.

Целевые платформы Kotlin/Native не требуют дополнительных зависимостей для тестирования: реализации API kotlin.test встроены.

kotlin {
    sourceSets {
        commonTest.dependencies {
            implementation(kotlin("test")) // This brings all the platform dependencies automatically
        }
    }
}
kotlin {
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin("test") // This brings all the platform dependencies automatically
            }
        }
    }
}

Для зависимости от модуля Kotlin можно использовать сокращенную запись, например kotlin("test") вместо "org.jetbrains.kotlin:kotlin-test".

Зависимость kotlin-test также можно использовать в любом общем наборе исходного кода или наборе для конкретной платформы.

Варианты kotlin-test для JVM

Для Kotlin/JVM Gradle по умолчанию использует JUnit 4. Поэтому зависимость kotlin("test") разрешается в вариант для JUnit 4, а именно kotlin-test-junit.

Можно выбрать JUnit 5 или TestNG, вызвав useJUnitPlatform() или useTestNG() в задаче тестирования сценария сборки. Ниже приведен пример для проекта Kotlin Multiplatform:

kotlin {
    jvm {
        testRuns["test"].executionTask.configure {
            useJUnitPlatform()
        }
    }
    sourceSets {
        commonTest.dependencies {
            implementation(kotlin("test"))
        }
    }
}
kotlin {
    jvm {
        testRuns["test"].executionTask.configure {
            useJUnitPlatform()
        }
    }
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin("test")
            }
        }
    }
}

Ниже приведен пример для проекта JVM:

dependencies {
    testImplementation(kotlin("test"))
}

tasks {
    test {
        useTestNG()
    }
}
dependencies {
    testImplementation 'org.jetbrains.kotlin:kotlin-test'
}

test {
    useTestNG()
}

Узнайте, как тестировать код с помощью JUnit на JVM.

Автоматическое разрешение вариантов JVM иногда может вызывать проблемы с конфигурацией. В этом случае можно явно указать нужную платформу и отключить автоматическое разрешение, добавив эту строку в файл gradle.properties проекта:

kotlin.test.infer.jvm.variant=false

Если вы явно использовали в сценарии сборки вариант kotlin("test") и сборка проекта перестала работать из-за конфликта совместимости, см. описание этой проблемы в руководстве по совместимости.

Добавление зависимости от библиотеки kotlinx

Если вы используете мультиплатформенную библиотеку и вам нужна зависимость от общего кода, укажите ее только один раз в общем наборе исходного кода. Используйте базовое имя артефакта библиотеки, например kotlinx-coroutines-core или ktor-client-core:

kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")
        }
    }
}
kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0'
            }
        }
    }
}

Если библиотека kotlinx нужна как зависимость для конкретной платформы, в соответствующем наборе исходного кода платформы также можно использовать базовое имя артефакта библиотеки:

kotlin {
    sourceSets {
        jvmMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")
        }
    }
}
kotlin {
    sourceSets {
        jvmMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0'
            }
        }
    }
}

Объявление репозиториев

Можно объявить общедоступный репозиторий, чтобы использовать его зависимости с открытым исходным кодом. В блоке repositories{} укажите имя репозитория:

repositories {
    mavenCentral()
}
repositories {
    mavenCentral()
}

Популярные репозитории: Maven Central и репозиторий Maven от Google.

Если вы также работаете с проектами Maven, рекомендуем не добавлять mavenLocal() в качестве репозитория, поскольку при переключении между проектами Gradle и Maven могут возникнуть проблемы. Если вам необходимо добавить репозиторий mavenLocal(), добавьте его последним в блок repositories{}. Дополнительную информацию см. в разделе Аргументы против mavenLocal().

Если одни и те же репозитории нужно объявить в нескольких подпроектах, объявите их централизованно в блоке dependencyResolutionManagement{} файла settings.gradle(.kts):

dependencyResolutionManagement {
    repositories {
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositories {
        mavenCentral()
    }
}

Любые репозитории, объявленные в подпроектах, переопределяют репозитории, объявленные централизованно. Дополнительную информацию о том, как управлять этим поведением и какие доступны параметры, см. в документации Gradle.

Регистрация сгенерированного исходного кода

Регистрируйте сгенерированный исходный код, чтобы IDE, сторонние плагины и другие инструменты могли отличать сгенерированный код от обычных исходных файлов. Это помогает таким инструментам, как IDE, по-разному выделять сгенерированный код в пользовательском интерфейсе и запускать задачи генерации при импорте проекта. Для регистрации сгенерированного исходного кода используйте интерфейс KotlinSourceSet.

Чтобы зарегистрировать каталог с файлами Kotlin, используйте свойство generatedKotlin типа SourceDirectorySet в файле build.gradle.kts. Например:

val generatorTask = project.tasks.register("generator") {
    val outputDirectory = project.layout.projectDirectory.dir("src/main/kotlinGen")
    outputs.dir(outputDirectory)
    doLast {
        outputDirectory.file("generated.kt").asFile.writeText(
            // language=kotlin
            """
            fun printHello() {
                println("hello")
            }
            """.trimIndent()
        )
    }
}

kotlin.sourceSets.getByName("main").generatedKotlin.srcDir(generatorTask)

В этом примере создается новая задача generator с выходным каталогом "src/main/kotlinGen". При запуске задачи действие doLast {} создает файл generated.kt в выходном каталоге. Затем в примере выходные данные задачи регистрируются как сгенерированный исходный код.

При разработке плагина Gradle можно использовать свойство allKotlinSources для доступа ко всем исходным файлам, зарегистрированным в свойствах KotlinSourceSet.kotlin и KotlinSourceSet.generatedKotlin.

Что дальше?

Узнайте больше о следующем:

  • Параметры компилятора и способы их передачи.

  • Инкрементальная компиляция, поддержка кэшей, отчеты о сборке и демон Kotlin.

  • Основы и особенности Gradle.

  • Поддержка вариантов плагинов Gradle.

3 сентября 2026 г.
Начало работы с Gradle и Kotlin/JVMРекомендации по работе с Gradle

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/gradle-configure-project.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API