Spec-Zone.ru › Kotlin 2

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

При добавлении Kotlin в существующий Java-проект Maven или создании нового проекта Kotlin Maven необходимо добавить плагин Kotlin Maven, который компилирует исходный код Kotlin и модули.

В настоящее время поддерживается только Maven версии 3.

Автоматическая настройка

Настроить Maven в смешанных проектах Java и Kotlin, а также в проектах только на Kotlin можно проще с помощью параметра <extensions>. Такой подход экономит время, поскольку вам не нужно настраивать плагин компилятора Maven.

Чтобы применить плагин Kotlin Maven с параметром <extensions>, обновите файл сборки pom.xml следующим образом:

  1. В разделе <properties> укажите целевые версии Kotlin и JVM:

    <properties>
        <maven.compiler.release>17</maven.compiler.release>
        <kotlin.version>2.4.20</kotlin.version>
    </properties>
    
  2. В разделе <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, compile Kotlin и compile Java, чтобы обеспечить их запуск в правильном порядке.

  • Автоматически согласует целевую версию JVM с версией компилятора Java, настроенной в проекте.

Если у вас смешанный проект Java и Kotlin, такая конфигурация гарантирует, что:

  • Код Kotlin компилируется первым.

  • Код Java компилируется после Kotlin и может ссылаться на классы Kotlin.

  • Поведение Maven по умолчанию не переопределяет порядок плагинов.

Конфигурация расширения заменяет весь раздел <executions>. Если вам нужно настроить выполнение, см. пример в разделе Компиляция исходного кода Kotlin и Java.

Если несколько плагинов сборки переопределяют жизненный цикл по умолчанию и при этом включен параметр <extensions>, при настройке жизненного цикла приоритет имеет последний плагин в разделе <build>. Все предыдущие изменения настроек жизненного цикла игнорируются.

В настоящее время версия плагина компилятора 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 в следующем порядке:

Приоритет 1
kotlin.compiler.jdkRelease
или kotlin.compiler.jvmTarget

Приоритет 2
maven.compiler.release

Приоритет 3
maven.compiler.target

Версии компилятора Kotlin

Если в проекте задано свойство kotlin.compiler.jdkRelease или kotlin.compiler.jvmTarget, приоритет имеет указанная в нем версия.

Обратите внимание, что эти параметры компилятора Kotlin работают по-разному:

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

Управляет версией байт-кода на выходе

Ограничивает API указанной версией JDK

kotlin.compiler.jvmTarget

Да

API JDK в коде не ограничиваются

kotlin.compiler.jdkRelease

Да

Да — разрешена только определенная версия API (эквивалент параметра компилятора Java --release)

Не задавайте одновременно разные параметры JDK для kotlin.compiler.jdkRelease и kotlin.compiler.jvmTarget. В противном случае возникнет ошибка.

Версии компилятора 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

Задает jvmTarget Kotlin

Задает jdkRelease Kotlin

Ограничивает API указанной версией JDK

maven.compiler.target

Да

Нет

Нет — путь к классам JDK сборки остается доступным

maven.compiler.release

Да

Да

Да — только для указанной версии API

Параметр <extensions> проверяет только свойства уровня проекта и глобальную конфигурацию maven-compiler-plugin. Он не проверяет конфигурации, заданные в разделе <executions> плагина.

Ручная настройка

Если в плагине 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.

  • Добавьте пользовательские выполнения, чтобы явно управлять этапами компиляции.

В Maven можно использовать специальный этап none, чтобы отключить выполнение по умолчанию.

Чтобы применить плагин 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:

  1. Укажите каталоги исходного кода в разделе <build>:

    <build>
        <sourceDirectory>src/main/kotlin</sourceDirectory>
        <testSourceDirectory>src/test/kotlin</testSourceDirectory>
    </build>
    
  2. Убедитесь, что плагин 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:

Приоритет 1
параметр jdkHome плагина kotlin-maven-plugin

Приоритет 2
версия JDK, заданная в
maven-toolchains-plugin

Приоритет 3
версия JAVA_HOME

  • Версия JDK, заданная параметром jdkHome в конфигурации kotlin-maven-plugin, всегда имеет приоритет над версией из цепочки инструментов.

  • Версия JDK в maven-toolchains-plugin переопределяет версию JDK, заданную в пути JAVA_HOME.

Также можно использовать специальный для плагина параметр <jdkToolchain>, чтобы напрямую задать версию JDK в цепочке инструментов для kotlin-maven-plugin. В отличие от использования maven-toolchains-plugin, этот параметр влияет только на компиляцию Kotlin и не затрагивает другие плагины сборки.

В настоящее время настройка maven-toolchains-plugin для использования определенной версии JDK не влияет на цели kapt и test-kapt в kotlin-maven-plugin. Вместо этого задайте необходимую версию в пути JAVA_HOME.

Настройка модулей 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>.

Что дальше?

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

13 августа 2026 г.
MavenНастройка репозиториев и зависимостей в проекте Maven

© 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

Spec-Zone.ru

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