Настройка проекта Maven
При добавлении Kotlin в существующий Java-проект Maven или создании нового проекта Kotlin Maven необходимо добавить плагин Kotlin Maven, который компилирует исходный код Kotlin и модули.
В настоящее время поддерживается только Maven версии 3.
Автоматическая настройка
Настроить Maven в смешанных проектах Java и Kotlin, а также в проектах только на Kotlin можно проще с помощью параметра <extensions>. Такой подход экономит время, поскольку вам не нужно настраивать плагин компилятора Maven.
Чтобы применить плагин Kotlin Maven с параметром <extensions>, обновите файл сборки pom.xml следующим образом:
-
В разделе
<properties>укажите целевые версии Kotlin и JVM:<properties> <maven.compiler.release>17</maven.compiler.release> <kotlin.version>2.4.20</kotlin.version> </properties> -
В разделе
<build><plugins>добавьте плагин Kotlin Maven с включенным параметром<extensions>:<build> <plugins> <!-- Kotlin compiler plugin configuration --> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <extensions>true</extensions> <!-- Enable the extension --> </plugin> <!-- No need to configure Maven compiler plugin with extensions --> </plugins> </build>
Параметр <extensions>:
Регистрирует каталоги
src/main/kotlinиsrc/test/kotlinкак корневые каталоги исходного кода, если они существуют, но не указаны в конфигурации плагина.Добавляет зависимость
kotlin-stdlib, если она еще не определена в проекте.Добавляет в сборку выполнения
compile,test-compile,kaptиtest-kapt, привязанные к соответствующим этапам жизненного цикла. Поэтому вам не нужно вручную настраивать раздел<executions>с параметрами<id>и<goals>для выполненийkapt,compileKotlin иcompileJava, чтобы обеспечить их запуск в правильном порядке.Автоматически согласует целевую версию JVM с версией компилятора Java, настроенной в проекте.
Если у вас смешанный проект Java и Kotlin, такая конфигурация гарантирует, что:
Код Kotlin компилируется первым.
Код Java компилируется после Kotlin и может ссылаться на классы Kotlin.
Поведение Maven по умолчанию не переопределяет порядок плагинов.
Конфигурация расширения заменяет весь раздел <executions>. Если вам нужно настроить выполнение, см. пример в разделе Компиляция исходного кода Kotlin и Java.
В настоящее время версия плагина компилятора Maven по умолчанию, используемая с <extensions>, — 3.10.1. Вы можете отдельно указать другую версию:
<build>
<plugins>
<!-- Kotlin compiler plugin configuration -->
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<extensions>true</extensions>
</plugin>
<!-- Maven compiler plugin configuration for Java classes -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
</plugin>
</plugins>
</build>
Целевая версия JVM
Параметр <extensions> гарантирует, что компиляторы Kotlin и Maven используют одну и ту же целевую версию байт-кода.
Плагин Kotlin Maven автоматически определяет целевую версию JVM в следующем порядке:
Версии компилятора Kotlin
Если в проекте задано свойство kotlin.compiler.jdkRelease или kotlin.compiler.jvmTarget, приоритет имеет указанная в нем версия.
Обратите внимание, что эти параметры компилятора Kotlin работают по-разному:
Параметр компилятора Kotlin |
Управляет версией байт-кода на выходе |
Ограничивает API указанной версией JDK |
|---|---|---|
|
Да |
API JDK в коде не ограничиваются |
|
Да |
Да — разрешена только определенная версия API (эквивалент параметра компилятора Java |
Версии компилятора Maven
-
Если не задан ни параметр
kotlin.compiler.jdkRelease, ни параметрkotlin.compiler.jvmTarget, плагин использует версиюmaven.compiler.release.Версию
maven.compiler.releaseможно определить как свойство проекта или в конфигурацииmaven-compiler-plugin. -
Если версия выпуска Maven не задана, плагин использует версию
maven.compiler.target.Ее можно определить как свойство проекта или в конфигурации
maven-compiler-plugin.
Обратите внимание, что параметры компилятора Maven target и release работают по-разному:
Параметр компилятора Maven |
Задает |
Задает |
Ограничивает API указанной версией JDK |
|---|---|---|---|
|
Да |
Нет |
Нет — путь к классам JDK сборки остается доступным |
|
Да |
Да |
Да — только для указанной версии API |
Ручная настройка
Если в плагине Kotlin Maven не включен параметр <extensions>, необходимо настроить проект вручную, чтобы обеспечить правильную компиляцию исходного кода.
Вы можете настроить проект Maven для компиляции исходного кода Java и Kotlin или только исходного кода Kotlin.
Компиляция исходного кода Kotlin и Java
Чтобы скомпилировать проект с исходными файлами Kotlin и Java, убедитесь, что компилятор Kotlin запускается до компилятора Java.
Компилятор Java не видит объявления Kotlin, пока они не скомпилированы в файлы .class. Если код Java использует классы Kotlin, сначала необходимо скомпилировать эти классы, чтобы избежать ошибок cannot find symbol.
Maven определяет порядок выполнения плагинов на основе двух основных факторов:
Порядок объявления плагинов в файле
pom.xml.Встроенные выполнения по умолчанию, например
default-compileиdefault-testCompile, которые всегда запускаются перед пользовательскими выполнениями независимо от их положения в файлеpom.xml.
Чтобы управлять порядком выполнения:
Объявите
kotlin-maven-pluginпередmaven-compiler-plugin.Отключите выполнения по умолчанию плагина компилятора Java.
Добавьте пользовательские выполнения, чтобы явно управлять этапами компиляции.
Чтобы применить плагин Kotlin Maven, обновите файл сборки pom.xml следующим образом:
<build>
<plugins>
<!-- Kotlin compiler plugin configuration -->
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>kotlin-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
<!-- Ensure Kotlin code can reference Java code -->
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>kotlin-test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
<!-- Maven compiler plugin configuration -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
<executions>
<!-- Disable default executions -->
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
<!-- Define custom executions -->
<execution>
<id>java-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>java-test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Эта конфигурация гарантирует, что:
Код Kotlin компилируется первым.
Код Java компилируется после Kotlin и может ссылаться на классы Kotlin.
Поведение Maven по умолчанию не переопределяет порядок плагинов.
Подробнее о том, как Maven обрабатывает выполнения плагинов, см. в официальной документации Maven: Руководство по идентификаторам выполнений плагинов по умолчанию.
Компиляция исходного кода только на Kotlin
Чтобы скомпилировать проект, содержащий только исходные файлы Kotlin, объявите корневые каталоги исходного кода и настройте плагин Kotlin Maven:
-
Укажите каталоги исходного кода в разделе
<build>:<build> <sourceDirectory>src/main/kotlin</sourceDirectory> <testSourceDirectory>src/test/kotlin</testSourceDirectory> </build> -
Убедитесь, что плагин Kotlin Maven применен:
<build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Установка версии JDK
Kotlin поддерживает цепочки инструментов Maven, которые помогают управлять версией JDK в сборке.
Если настроить maven-toolchains-plugin в сборке, можно указать версию JDK для компиляции Kotlin независимо от версии JVM, в которой работает Maven (заданной в пути JAVA_HOME). Затем плагин Kotlin Maven автоматически выбирает указанную цепочку инструментов JDK.
Это позволяет настроить одну цепочку инструментов, которая управляет версией JDK для всех плагинов сборки, включая компиляцию Kotlin. Например:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>21</version>
</jdk>
</toolchains>
</configuration>
</plugin>
Учитывайте приоритет различных способов указания версии JDK:
Версия JDK, заданная параметром
jdkHomeв конфигурацииkotlin-maven-plugin, всегда имеет приоритет над версией из цепочки инструментов.Версия JDK в
maven-toolchains-pluginпереопределяет версию JDK, заданную в путиJAVA_HOME.
Также можно использовать специальный для плагина параметр <jdkToolchain>, чтобы напрямую задать версию JDK в цепочке инструментов для kotlin-maven-plugin. В отличие от использования maven-toolchains-plugin, этот параметр влияет только на компиляцию Kotlin и не затрагивает другие плагины сборки.
Настройка модулей Java (JPMS)
Плагин Kotlin Maven поддерживает систему модулей платформы Java (JPMS), поэтому можно компилировать код Kotlin вместе с дескриптором module-info.java и использовать полученный модуль так же, как другие модули Java.
В файл сборки не нужно добавлять специальные параметры JPMS. Просто настройте компилятор Kotlin перед Maven.
Если присутствует дескриптор module-info.java, компилятор Kotlin использует его как исходный файл и выполняет компиляцию с путем модулей вместо пути к классам. Компилятор Kotlin считывает дескриптор для разрешения графа модулей, а затем компилятор Maven компилирует его в файл module-info.class.
Чтобы настроить модуль Java, создайте файл module-info.java в каталоге ${project.basedir}/src/main/java. В дескрипторе модуля объявите все необходимые модулю зависимости и экспортируемые им пакеты. Например:
module org.example.myapp {
requires transitive kotlin.stdlib;
requires java.net.http;
exports org.example.myapp;
}
Обратите внимание, что:
Модуль Java может использовать только объявленные в нем элементы. Поскольку при компиляции используется путь модулей, а не путь к классам, дескриптор должен содержать все зависимости, используемые кодом Kotlin: стандартную библиотеку, модули JDK (кроме
java.base) и другие библиотеки. В противном случае могут возникнуть ошибкиUnresolved reference.В модуле имя пакета в файлах Kotlin должно совпадать с именем пакета из
module-info.java, чтобы избежать сбоев сборкиPackage is empty or does not exist.Файл сборки
pom.xmlдолжен быть настроен так, чтобы Kotlin компилировался перед Java. Если вы используете автоматическую настройку проекта, это уже обеспечивается параметром<extensions>.
Что дальше?
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/maven-configure-project.html