Spec-Zone.ru › Kotlin 1.6

Gradle

Для построения проекта Kotlin с помощью Gradle, необходимо применить плагин Kotlin Gradle к вашему проекту и настроить зависимости.

Плагин и версии

Примените плагин Kotlin Gradle, используя DSL плагинов Gradle.

Плагин Kotlin Gradle и плагин kotlin-multiplatform 1.6.20 требуют Gradle версии 6.1 или выше.

plugins {
  kotlin("<...>") version "1.6.20"
}
plugins {
  id 'org.jetbrains.kotlin.<...>' version '1.6.20'
}

Заполнитель <...> следует заменить именем одного из плагинов, которые будут рассмотрены в последующих разделах.

Настройка для нескольких платформ

Проекты, нацеленные на несколько платформ, называемые проектами для нескольких платформ, требуют плагин kotlin-multiplatform. Узнайте больше о плагине.

Плагин kotlin-multiplatform работает с Gradle 6.1 или выше.

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

Настройка для JVM

Для работы с JVM примените плагин Kotlin JVM.

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

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

В качестве альтернативы можно использовать более старый подход apply plugin.

apply plugin: 'kotlin'

Применение плагинов Kotlin с apply в Kotlin Gradle DSL не рекомендуется – узнайте почему.

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 и compileJava

  • compileTestKotlin и compileTestJava

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

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

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

  • warning – значение по умолчанию; плагин Kotlin Gradle выведет сообщение об ошибке.

  • error – плагин прервет сборку.

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

Настройка пользовательской JDK

По умолчанию задачи компиляции Kotlin используют текущую JDK Gradle. Если необходимо изменить JDK по какой-либо причине, можно настроить домашнюю директорию JDK следующими способами:

  • Для Gradle 6.7 и выше – с помощью Java toolchains или Task DSL для задания локальной JDK.

  • Для более ранних версий Gradle без Java toolchains (до 6.6) – с интерфейсом UsesKotlinJavaToolchain и Task DSL.

Параметр компилятора jdkHome устарел начиная с Kotlin 1.5.30.

При использовании пользовательской JDK обратите внимание, что рабочие процессы kapt используют только kapt task workers с режимом изоляции процесса process isolation mode и игнорируют свойство kapt.workers.isolation.

Поддержка Java toolchains в Gradle

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 daemon. Java toolchain:

  • Устанавливает опцию jdkHome, доступную для целей JVM.

  • Устанавливает kotlinOptions.jvmTarget до версии JDK toolchain, если пользователь явно не задаёт опцию jvmTarget. Если пользователь не настраивает toolchain, поле jvmTarget будет использовать значение по умолчанию. Дополнительную информацию об совместимости целевой JVM см. ниже.

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

Используйте следующий код для задания toolchain. Замените placeholder <MAJOR_JDK_VERSION> на версию JDK, которую вы хотите использовать:

kotlin {
    jvmToolchain {
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8" 
    }
}
kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
    }
}

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

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

Для задания любой JDK (даже локальной) для конкретной задачи используйте Task DSL.

Установка версии JDK с помощью Task DSL

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

val service = project.extensions.getByType<JavaToolchainService>()
val customLauncher = service.launcherFor {
    it.languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
}
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>)) // "8"
}
tasks.withType(UsesKotlinJavaToolchain::class).configureEach { task ->
    task.kotlinJavaToolchain.toolchain.use(customLauncher)
}

Или вы можете указать путь к локальному JDK и заменить placeholder <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
    )
}

Настройка для JavaScript

При работе только с JavaScript используйте плагин kotlin-js. Подробнее

plugins {
    kotlin("js") version "1.6.20"
}
plugins {
    id 'org.jetbrains.kotlin.js' version '1.6.20'
}

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'
    }
}

Настройка для Android

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

END_OF_DOCUMENT_MARKER

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

Для добавления зависимости от библиотеки задайте зависимость требуемого типа (например, 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

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

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

implementation

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

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

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

compileOnly

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

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

runtimeOnly

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

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

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

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

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

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

kotlin.stdlib.default.dependency=false

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

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

  • kotlin-test-common и kotlin-test-annotations-common для общих наборов исходных файлов

  • kotlin-test-junit для наборов исходных файлов JVM

  • kotlin-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, например, kotlin("test") для "org.jetbrains.kotlin:kotlin-test".

Вы также можете использовать зависимость 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.6.0")
            }
        }
    }
}
kotlin {
    sourceSets {
        jvmMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0'
            }
        }
    }
}

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

kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")
            }
        }
    }
}
kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
            }
        }
    }
}

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

В качестве альтернативы, вы можете указать зависимости на верхнем уровне, используя следующую схему для имён конфигураций: <sourceSetName><DependencyType>. Это может быть полезно для некоторых встроенных зависимостей Gradle, таких как gradleApi(), localGroovy(), или gradleTestKit(), которые недоступны в DSL зависимостей наборов исходных файлов.

dependencies {
    "commonMainImplementation"("com.example:my-library:1.0")
}
dependencies {
    commonMainImplementation 'com.example:my-library:1.0'
}

Обработка аннотаций

Kotlin поддерживает обработку аннотаций с помощью инструмента обработки аннотаций Kotlin kapt.

Инкрементная компиляция

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

Инкрементная компиляция поддерживается для проектов Kotlin/JVM и Kotlin/JS и включена по умолчанию.

Существует несколько способов выключения инкрементной компиляции:

  • kotlin.incremental=false для проектов Kotlin/JVM.

  • kotlin.incremental.js=false для проектов Kotlin/JS.

  • Используйте -Pkotlin.incremental=false или -Pkotlin.incremental.js=false в качестве параметра командной строки.

    Параметр должен быть добавлен в каждую последующую сборку, и любая сборка с отключённой инкрементной компиляцией делает недействительными кеши инкрементной компиляции.

Первая сборка никогда не является инкрементной.

END_OF_DOCUMENT_MARKER

Поддержка кэша сборки Gradle

Плагин Kotlin использует кэш сборки Gradle, который хранит результаты сборки для повторного использования в будущих сборках.

Чтобы отключить кэширование для всех задач Kotlin, установите системную переменную kotlin.caching.enabled в значение false (запустите сборку со значением -Dkotlin.caching.enabled=false).

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

Поддержка кэша конфигурации Gradle

Кэш конфигурации доступен в Gradle 6.5 и новее в качестве экспериментальной функции. Вы можете проверить страницу выпусков Gradle, чтобы узнать, стала ли она стабильной.

Плагин Kotlin использует кэш конфигурации Gradle, который ускоряет процесс сборки, повторно используя результаты фазы конфигурации.

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

END_OF_DOCUMENT_MARKER

Параметры компилятора

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

При компиляции для JVM задачи называются compileKotlin для производственного кода и compileTestKotlin для тестового кода. Задачи для настраиваемых наборов исходных файлов называются в соответствии с шаблонами compile<Name>Kotlin.

Имена задач в проектах Android содержат имена вариантов сборки и следуют шаблону compile<BuildVariant>Kotlin, например, compileDebugKotlin или compileReleaseUnitTestKotlin.

При компиляции для JavaScript задачи называются compileKotlinJs для производственного кода и compileTestKotlinJs для тестового кода, и compile<Name>KotlinJs для настраиваемых наборов исходных файлов.

Чтобы настроить отдельную задачу, используйте её имя. Примеры:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// ...

val compileKotlin: KotlinCompile by tasks

compileKotlin.kotlinOptions.suppressWarnings = true
compileKotlin {
    kotlinOptions.suppressWarnings = true
}

//or

compileKotlin {
    kotlinOptions {
        suppressWarnings = true
    }
}

Обратите внимание, что с Gradle Kotlin DSL вы должны сначала получить задачу из tasks проекта.

Используйте типы Kotlin2JsCompile и KotlinCompileCommon для целей JS и common соответственно.

Также можно настроить все задачи компиляции Kotlin в проекте:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
    kotlinOptions { /*...*/ }
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions { /*...*/ }
}

Вот полный список параметров для задач Gradle:

Общие атрибуты для JVM, JS и JS DCE

Имя

Описание

Возможные значения

Значение по умолчанию

allWarningsAsErrors

Сообщать об ошибке, если есть предупреждения

false

suppressWarnings

Не генерировать предупреждения

false

verbose

Включить подробный вывод журнала. Работает только при включенном уровне отладки журнала Gradle

false

freeCompilerArgs

Список дополнительных аргументов компилятора

[]

Общие атрибуты для JVM и JS

Имя

Описание

Возможные значения

Значение по умолчанию

apiVersion

Ограничить использование объявлений теми, которые относятся к указанной версии встроенных библиотек

"1.3" (УСТАРЕЛО), "1.4" (УСТАРЕЛО), "1.5", "1.6", "1.7" (ЭКСПЕРИМЕНТАЛЬНО)

languageVersion

Обеспечить совместимость исходного кода с указанной версией Kotlin

"1.4" (УСТАРЕЛО), "1.5", "1.6", "1.7" (ЭКСПЕРИМЕНТАЛЬНО)

Атрибуты, специфичные для JVM

Имя

Описание

Возможные значения

Значение по умолчанию

javaParameters

Генерировать метаданные для отражения Java 1.8 на параметрах метода

false

jdkHome

Включить пользовательский JDK из указанного местоположения в classpath вместо JAVA_HOME по умолчанию. Прямая настройка устарела с версии 1.5.30, используйте другие способы установки этого параметра.

jvmTarget

Целевая версия генерируемого байт-кода JVM

"1.6" (УСТАРЕЛО), "1.8", "9", "10", "11", "12", "13", "14", "15", "16", "17"

"1.8"

noJdk

Не включать автоматически среду выполнения Java в classpath

false

useOldBackend

Использовать старый бэкенд JVM

false

Атрибуты, специфичные для JS

Имя

Описание

Возможные значения

Значение по умолчанию

friendModulesDisabled

Отключить экспорт внутренних объявлений

false

main

Определить, следует ли вызывать функцию main при выполнении

"call", "noCall"

"call"

metaInfo

Генерировать файлы .meta.js и .kjsm с метаданными. Используется для создания библиотеки

true

moduleKind

Тип модуля JS, генерируемого компилятором

"umd", "commonjs", "amd", "plain"

"umd"

noStdlib

Не включать автоматически стандартную библиотеку Kotlin/JS по умолчанию в зависимости компиляции

true

outputFile

Целевой файл *.js для результата компиляции

"<buildDir>/js/packages/<project.name>/kotlin/<project.name>.js"

sourceMap

Генерировать карту исходного кода

true

sourceMapEmbedSources

Встраивать исходные файлы в карту исходного кода

"never", "always", "inlining"

sourceMapPrefix

Добавить указанный префикс к путям в карте исходного кода

target

Генерировать JS файлы для конкретной версии ECMA

"v5"

"v5"

typedArrays

Преобразовывать примитивные массивы в типизированные массивы JS

true

Генерация документации

Для генерации документации для проектов Kotlin используйте Dokka; пожалуйста, обратитесь к Dokka README для инструкций по настройке. Dokka поддерживает проекты на смешанных языках и может генерировать выходные данные в нескольких форматах, включая стандартный JavaDoc.

OSGi

Для поддержки OSGi см. страницу Kotlin OSGi.

Использование Gradle Kotlin DSL

При использовании Gradle Kotlin DSL, применяйте плагины Kotlin с помощью блока plugins { ... }. Если вы применяете их с помощью apply { plugin(...) } вместо этого, вы можете столкнуться с неразрешёнными ссылками на расширения, генерируемые Gradle Kotlin DSL. Чтобы решить эту проблему, вы можете закомментировать ошибочные использования, запустить задачу Gradle kotlinDslAccessorsSnapshot, а затем раскомментировать использования и перезапустить сборку или повторно импортировать проект в IDE.

END_OF_DOCUMENT_MARKER

Kotlin-демон и его использование с Gradle

Kotlin-демон:

  • Работает совместно с Gradle-демоном для компиляции проекта.

  • Работает отдельно при компиляции проекта с встроенной системой сборки IntelliJ IDEA.

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

Kotlin-демон использует ту же JDK, что и Gradle-демон.

Установка аргументов JVM для Kotlin-демона

Каждый из параметров в следующем списке переопределяет предыдущие:

  • Если ничего не указано, Kotlin-демон наследует аргументы от Gradle-демона. Например, в файле gradle.properties.

    org.gradle.jvmargs=-Xmx1500m -Xms=500m
    
  • Если аргументы JVM Gradle-демона имеют системную переменную kotlin.daemon.jvm.options, используйте её в файле gradle.properties:

    org.gradle.jvmargs=-Dkotlin.daemon.jvm.options=-Xmx1500m,Xms=500m
    

    При передаче аргументов следуйте этим правилам:

    • Используйте знак минус - перед аргументами Xmx, XX:MaxMetaspaceSize, и XX:ReservedCodeCacheSize, не используя его перед другими аргументами.

    • Разделяйте аргументы запятыми (,) без пробелов. Аргументы, следующие за пробелом, будут использованы для Gradle-демона, а не для Kotlin-демона.

    Gradle игнорирует эти свойства, если выполнены все следующие условия:

    • Gradle использует JDK 1.9 или выше.

    • Версия Gradle находится в диапазоне от 7.0 до 7.1.1 включительно.

    • Gradle компилирует скрипты Kotlin DSL.

    • Kotlin-демон не запущен.

    Чтобы обойти это, обновите Gradle до версии 7.2 (или выше) или используйте свойство kotlin.daemon.jvmargs — см. следующий пункт.

  • Вы можете добавить свойство kotlin.daemon.jvmargs в файле gradle.properties:

    kotlin.daemon.jvmargs=-Xmx1500m -Xms=500m
    
  • Вы можете указать аргументы в расширении kotlin:

    kotlin {
        kotlinDaemonJvmArgs = listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC")
    }
    
    kotlin {
        kotlinDaemonJvmArgs = ["-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"]
    }
    
  • Вы можете указать аргументы для конкретной задачи:

    tasks.withType<CompileUsingKotlinDaemon>().configureEach {
        kotlinDaemonJvmArguments.set(listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"))
        }
    
    tasks.withType(CompileUsingKotlinDaemon::class).configureEach { task ->
        task.kotlinDaemonJvmArguments.set(["-Xmx1g", "-Xms512m"])
        }
    

    В этом случае новый экземпляр Kotlin-демона может запуститься при выполнении задачи. Подробнее о поведении Kotlin-демона с аргументами JVM.

Поведение Kotlin-демона с аргументами JVM

При настройке аргументов JVM для Kotlin-демона обратите внимание на следующее:

  • Ожидается, что одновременно будут работать несколько экземпляров Kotlin-демона, когда разные подпроекты или задачи имеют разные наборы аргументов JVM.

  • Новый экземпляр Kotlin-демона запускается только тогда, когда Gradle выполняет связанную задачу компиляции, и существующие Kotlin-демоны не имеют такого же набора аргументов JVM. Представьте, что ваш проект содержит много подпроектов. Большинство из них требует определенного объема памяти для Kotlin-демона, но один модуль требует много памяти (хотя он редко компилируется). В этом случае вы должны предоставить другой набор аргументов JVM для такого модуля, чтобы Kotlin-демон с большим размером кучи запускался только для разработчиков, работающих с этим конкретным модулем.

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

  • Если Xmx не указан, Kotlin-демон унаследует его от Gradle-демона.

Определение стратегии выполнения компилятора Kotlin

Стратегия выполнения компилятора Kotlin определяет, где выполняется компилятор Kotlin и поддерживается ли инкрементная компиляция в каждом случае.

Существует три стратегии выполнения компилятора:

Стратегия

Место выполнения компилятора Kotlin

Инкрементная компиляция

Другие характеристики

Демнонный

Внутри своего демона

Да

По умолчанию. Может быть общим для разных демонов Gradle

В процессе

Внутри Gradle-демона

Нет

Может использовать одну кучу с Gradle-демоном

Вне процесса

В отдельном процессе для каждого вызова

Нет

-

Для определения стратегии выполнения компилятора Kotlin можно использовать одно из следующих свойств:

  • Свойство Gradle kotlin.compiler.execution.strategy.

  • Свойство задачи компиляции compilerExecutionStrategy.

  • Системное свойство -Dkotlin.compiler.execution.strategy, которое будет удалено в будущих версиях.

Приоритет свойств следующий:

  • Свойство задачи compilerExecutionStrategy имеет приоритет над системным свойством и свойством Gradle kotlin.compiler.execution.strategy.

  • Свойство Gradle имеет приоритет над системным свойством.

Доступные значения для свойств kotlin.compiler.execution.strategy (как системных, так и Gradle):

  1. daemon (по умолчанию)

  2. in-process

  3. ouf-of-process

Используйте свойство Gradle kotlin.compiler.execution.strategy в gradle.properties:

kotlin.compiler.execution.strategy=out-of-process

Доступные значения для свойства задачи compilerExecutionStrategy:

  1. org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy.DAEMON (по умолчанию)

  2. org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy.IN_PROCESS

  3. org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy.OUT_OF_PROCESS

Используйте свойство задачи compilerExecutionStrategy в своих скриптах сборки:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy

// ...

tasks.withType<KotlinCompile>().configureEach {
    compilerExecutionStrategy.set(KotlinCompilerExecutionStrategy.IN_PROCESS)
} 
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy

// ...

tasks.withType(KotlinCompile)
    .configureEach {
         compilerExecutionStrategy.set(KotlinCompilerExecutionStrategy.IN_PROCESS)
    }
Последнее изменение: 07 апреля 2022
Ключевые слова и операторы Maven

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

Spec-Zone.ru

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