Настройка проекта 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) с доступными версиями 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 |
Также можно использовать последние выпуски 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.
В файл gradle.properties проекта можно добавить свойства, чтобы настроить это поведение:
Свойство Gradle |
Описание |
|---|---|
|
Задаёт расположение для хранения данных на уровне проекта. По умолчанию: |
|
Управляет тем, отключена ли запись данных Kotlin в каталог |
Настройка целевой платформы 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
Если вы не используете соглашение по умолчанию, необходимо обновить соответствующее свойство 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иcompileJavacompileTestKotlinиcompileTestJava
Для таких связанных задач плагин 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
В 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.
Чтобы задать любую 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}"]
}
})
}
Подробнее:
Другие сведения
Отключение использования артефакта в задаче компиляции
В некоторых редких случаях сборка может завершиться ошибкой из-за циклической зависимости. Например, когда у вас есть несколько компиляций, одна из которых видит все внутренние объявления другой, а созданный артефакт зависит от результатов обеих задач компиляции:
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.
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
/* ... */
}
}
Настройка целевой платформы 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.jswasmWasi: для запуска в средах 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
/* ... */
}
}
}
Исходный код 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 текущего модуля используется какой-либо тип из зависимости, используйте зависимость |
|
Используется при компиляции и во время выполнения текущего модуля, но не предоставляется для компиляции других модулей, зависящих от модуля с зависимостью `implementation`. |
Используйте для зависимостей, необходимых внутренней логике модуля. Если модуль — это конечное приложение, которое не публикуется, используйте зависимости |
|
Используется при компиляции текущего модуля и недоступен во время выполнения и при компиляции других модулей. |
Используйте для API, у которых есть сторонняя реализация, доступная во время выполнения. |
|
Доступен во время выполнения, но не виден при компиляции какого-либо модуля. |
Зависимость от стандартной библиотеки
Зависимость от стандартной библиотеки (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.0kotlin-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-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.
Если одни и те же репозитории нужно объявить в нескольких подпроектах, объявите их централизованно в блоке 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.
Что дальше?
Узнайте больше о следующем:
© 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