Настройка проекта Gradle
Для построения проекта Kotlin с Gradle, необходимо добавить плагин Kotlin Gradle в файл скрипта сборки build.gradle(.kts) и настроить зависимости проекта там же.
Применение плагина
Для применения плагина Kotlin Gradle, используйте plugins блок из DSL плагинов Gradle:
// replace `<...>` with the plugin name
plugins {
kotlin("<...>") version "1.9.0"
}
// replace `<...>` with the plugin name
plugins {
id 'org.jetbrains.kotlin.<...>' version '1.9.0'
}
При настройке проекта проверьте совместимость плагина Kotlin Gradle (KGP) с доступными версиями Gradle. В следующей таблице указаны минимальные и максимальные полностью поддерживаемые версии Gradle и плагина Android Gradle (AGP):
Версия KGP |
Минимальные и максимальные версии Gradle |
Минимальные и максимальные версии AGP |
|---|---|---|
1.9.0 |
6.8.3 – 7.6.0 |
4.2.2 – 7.4.0 |
1.8.20 |
6.8.3 – 7.6.0 |
4.1.3 – 7.4.0 |
1.8.0 |
6.8.3 – 7.3.3 |
4.1.3 – 7.2.1 |
1.7.20 |
6.7.1 – 7.1.1 |
3.6.4 – 7.0.4 |
1.7.0 |
6.7.1 – 7.0.2 |
3.4.3 – 7.0.2 |
1.6.20 |
6.1.1 - 7.0.2 |
3.4.3 - 7.0.2 |
Например, плагин Kotlin Gradle и плагин kotlin-multiplatform версии 1.9.0 требуют минимальной версии Gradle 6.8.3 для компиляции проекта.
Аналогично, максимальная полностью поддерживаемая версия — 7.6.0. Она не содержит устаревших методов и свойств Gradle и поддерживает все текущие функции Gradle.
Назначение JVM
Для назначения JVM примените плагин Kotlin JVM.
plugins {
kotlin("jvm") version "1.9.0"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "1.9.0"
}
Значение 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.
Настройте поведение этой проверки для всего проекта, установив свойство kotlin.jvm.target.validation.mode в файле build.gradle(.kts) в значение:
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 "1.9.0"
}
plugins {
id "org.jetbrains.kotlin.jvm" version "1.9.0"
}
Когда в скрипте сборки нет явной информации о значении jvmTarget , его значение по умолчанию равно null, и компилятор преобразует его в значение по умолчанию 1.8. Значение targetCompatibility равно текущей версии JDK Gradle, которая равна вашей версии JDK (если вы не используете подход с Java toolchain). Предполагая, что ваша версия JDK — 17, ваш опубликованный артефакт библиотеки объявит себя совместимым с JDK 17+: org.gradle.jvm.version=17, что неверно. В этом случае вам необходимо использовать Java 17 в вашем основном проекте для добавления этой библиотеки, даже если версия байткода 1.8. Настройка toolchain решит эту проблему.
Поддержка Gradle Java toolchains
Gradle 6.7 ввёл поддержку Java toolchains. С помощью этой функции вы можете:
Использовать JDK и JRE, отличающиеся от тех, что используются Gradle, для выполнения компиляции, тестов и исполняемых файлов.
Компилировать и тестировать код с ещё не выпущенной версией языка.
С поддержкой toolchains, Gradle может автоматически обнаруживать локальные JDK и устанавливать недостающие JDK, необходимые Gradle для сборки. Теперь сам Gradle может работать на любом JDK и по-прежнему использовать функцию кэширования удалённых сборок для задач, зависящих от основной версии JDK.
Плагин Kotlin Gradle поддерживает Java toolchains для задач компиляции Kotlin/JVM. Задачи JS и Native не используют toolchains. Kotlin-компилятор всегда работает на JDK, на котором работает демон Gradle. Java toolchain:
Устанавливает
-jdk-homeопцию, доступную для целей JVM.Устанавливает
compilerOptions.jvmTargetна версию JDK toolchain, если пользователь не устанавливаетjvmTargetопцию явно. Если пользователь не настраивает toolchain, полеjvmTargetиспользует значение по умолчанию. Подробнее о совместимости целевой JVM.Устанавливает toolchain, который будет использоваться для любых задач Java компиляции, тестирования и документации.
Влияет на то, на каком JDK
kaptрабочие процессы выполняются.
Используйте следующий код для установки toolchain. Замените заполнитель <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.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
// Or shorter:
jvmToolchain(<MAJOR_JDK_VERSION>)
// For example:
jvmToolchain(17)
}
Обратите внимание, что установка toolchain через расширение kotlin обновляет toolchain для задач Java компиляции.
Вы можете установить toolchain через расширение java, и задачи компиляции Kotlin будут его использовать:
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>))
}
}
Если вы используете Gradle 8.0.2 или выше, вам также необходимо добавить плагин разрешения toolchains. Этот тип плагина управляет тем, откуда загружать toolchain.
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version("0.5.0")
}
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
}
Проверьте, что версия foojay-resolver-convention соответствует вашей версии Gradle на сайте Gradle.
Для установки любого JDK (даже локального) для конкретной задачи используйте Task DSL.
Узнайте больше о поддержке Gradle JVM toolchain в плагине Kotlin.
Установка версии JDK с помощью Task DSL
Task 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.set(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.
// Add the following three lines if you use a Gradle version less than 7.0
java {
modularity.inferModulePath.set(true)
}
tasks.named("compileJava", JavaCompile::class.java) {
options.compilerArgumentProviders.add(CommandLineArgumentProvider {
// Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
listOf("--patch-module", "YOUR_MODULE_NAME=${sourceSets["main"].output.asPath}")
})
}
// Add the following three lines if you use a Gradle version less than 7.0
java {
modularity.inferModulePath = true
}
tasks.named("compileJava", JavaCompile.class) {
options.compilerArgumentProviders.add(new CommandLineArgumentProvider() {
@Override
Iterable<String> asArguments() {
// Provide compiled Kotlin classes to javac – needed for Java/Kotlin mixed sources to work
return ["--patch-module", "YOUR_MODULE_NAME=${sourceSets["main"].output.asPath}"]
}
})
}
Узнайте больше о:
Дополнительные сведения
Узнайте больше о Kotlin/JVM.
Леничная создание задач Kotlin/JVM
Начиная с Kotlin 1.8.20, плагин Kotlin для Gradle регистрирует все задачи, но не настраивает их при выполнении пробного запуска.
Нестандартное расположение директории destinationDirectory задач компиляции
Если вы переопределяете расположение задачи Kotlin/JVM KotlinJvmCompile/KotlinCompile destinationDirectory, обновите свой скрипт сборки. Вам необходимо явно добавить 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 "1.9.0"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.9.0'
}
Узнайте больше о Kotlin Multiplatform для различных платформ и Kotlin Multiplatform для iOS и Android.
Настройка для Android
Для создания приложений для Android рекомендуется использовать Android Studio. Узнайте, как использовать плагин Android Gradle.
Настройка для JavaScript
При настройке для JavaScript также используйте плагин kotlin-multiplatform. Узнайте больше о настройке проекта Kotlin/JS
plugins {
kotlin("multiplatform") version "1.9.0"
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.9.0'
}
Kotlin и Java исходные файлы для JavaScript
Этот плагин работает только с 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 {
val commonMain by getting {
dependencies {
implementation("com.example:my-library:1.0")
}
}
}
}
kotlin {
sourceSets {
commonMain {
dependencies {
implementation 'com.example:my-library:1.0'
}
}
}
}
В качестве альтернативы вы можете указать зависимости на верхнем уровне.
Типы зависимостей
Выберите тип зависимости в зависимости от ваших потребностей.
Тип |
Описание |
Когда использовать |
|---|---|---|
|
Используется как во время компиляции, так и во время выполнения и экспортируется для потребителей библиотек. |
Если любой тип из зависимости используется в общедоступном API текущего модуля, используйте зависимость |
|
Используется во время компиляции и выполнения для текущего модуля, но не экспортируется для компиляции других модулей, зависящих от модуля с зависимостью `implementation`. |
Используйте для зависимостей, необходимых для внутренней логики модуля. Если модуль является конечным приложением, которое не публикуется, используйте зависимости |
|
Используется для компиляции текущего модуля и не доступен во время выполнения или во время компиляции других модулей. |
Используйте для API, у которых имеется реализация стороннего разработчика, доступная во время выполнения. |
|
Доступен во время выполнения, но не виден во время компиляции любого модуля. |
Зависимость от стандартной библиотеки
Зависимость от стандартной библиотеки (stdlib) автоматически добавляется к каждому набору исходных данных. Версия стандартной библиотеки совпадает с версией плагина Kotlin Gradle.
Для наборов исходных данных, специфичных для платформы, используется соответствующий вариант библиотеки, специфичный для платформы, а общая стандартная библиотека добавляется ко всем остальным. Плагин Kotlin Gradle выбирает соответствующую стандартную библиотеку JVM в зависимости от compilerOptions.jvmTarget параметра компилятора вашего скрипта Gradle.
Если вы явно объявляете зависимость от стандартной библиотеки (например, если вам нужна другая версия), плагин Kotlin Gradle не переопределит её и не добавит вторую стандартную библиотеку.
Если вам вообще не нужна стандартная библиотека, вы можете добавить опцию исключения в gradle.properties.
kotlin.stdlib.default.dependency=false
Выравнивание версий транзитивных зависимостей
Если вы явно указываете версию Kotlin 1.8.0 или выше в своих зависимостях, например: implementation("org.jetbrains.kotlin:kotlin-stdlib:1.8.0"), тогда плагин Kotlin Gradle использует эту версию Kotlin для транзитивных kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8 зависимостей. Это сделано для предотвращения дублирования классов из разных версий stdlib. Узнайте больше о слиянии kotlin-stdlib-jdk7 и kotlin-stdlib-jdk8 в kotlin-stdlib. Вы можете отключить это поведение с помощью свойства Gradle kotlin.stdlib.jdk.variants.version.alignment:
kotlin.stdlib.jdk.variants.version.alignment=false
Другие способы выравнивания версий
-
В случае проблем с выравниванием версий, выровняйте все версии с помощью BOM Kotlin BOM. Укажите зависимость платформы от
kotlin-bomв вашем скрипте сборки:implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.9.0"))implementation platform('org.jetbrains.kotlin:kotlin-bom:1.9.0')
Указание зависимостей от библиотек тестирования
API kotlin.test доступен для тестирования проектов Kotlin на всех поддерживаемых платформах. Добавьте зависимость kotlin-test в commonTest набор исходных файлов, чтобы плагин Gradle мог определить соответствующие зависимости тестирования для каждого набора исходных файлов тестирования:
kotlin-test-commonиkotlin-test-annotations-commonдля общих наборов исходных файловkotlin-test-junitдля наборов исходных файлов JVMkotlin-test-jsдля наборов исходных файлов Kotlin/JS
Для целей Kotlin/Native дополнительные зависимости тестирования не требуются, и реализации API kotlin.test встроенные.
kotlin {
sourceSets {
val commonTest by getting {
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/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 {
val commonTest by getting {
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, отключите автоматический выбор фреймворка тестирования, добавив строку kotlin.test.infer.jvm.variant=false в файл gradle.properties проекта. После этого добавьте фреймворк как зависимость Gradle.
Если вы явно использовали вариант kotlin("test") в своём скрипте сборки и сборка проекта перестала работать из-за конфликта совместимости, см. эту проблему в руководстве по совместимости.
Указание зависимости от библиотеки kotlinx
Если вы используете kotlinx библиотеку и вам нужна платформенно-специфичная зависимость, вы можете использовать платформенно-специфичные варианты библиотек с суффиксом, например, -jvm или -js, например, kotlinx-coroutines-core-jvm. Вы также можете использовать имя базового артефакта библиотеки — kotlinx-coroutines-core.
kotlin {
sourceSets {
val jvmMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1")
}
}
}
}
kotlin {
sourceSets {
jvmMain {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1'
}
}
}
}
Если вы используете многоплатформенную библиотеку и вам нужно зависеть от общего кода, установите зависимость только один раз в общем наборе исходных файлов. Используйте имя базового артефакта библиотеки, например, kotlinx-coroutines-core или ktor-client-core.
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
}
}
}
}
kotlin {
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1'
}
}
}
}
Указание зависимостей на верхнем уровне
В качестве альтернативы вы можете указать зависимости на верхнем уровне, используя следующий шаблон для имён конфигураций: <sourceSetName><DependencyType>. Это может быть полезно для некоторых встроенных зависимостей Gradle, таких как gradleApi(), localGroovy(), или gradleTestKit(), которые недоступны в DSL зависимостей наборов исходных файлов.
dependencies {
"commonMainImplementation"("com.example:my-library:1.0")
}
dependencies {
commonMainImplementation 'com.example:my-library:1.0'
}
Что дальше?
Узнайте больше о:
© 2010–2023 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