Иногда бывает, что проект пишется на kotlin, я относительно недавно открыл для себя ktor-project, очень удобная штука, но бывают ситуации, когда нужно добавить код, написанный на java, какие же ситуации тут могут быть?

  • Классы сгенерированные
  • Нужно втащить кусок либы
  • Что-то еще, когда не хочется или не получается подключить jar в зависимости

Можно пойти по пути перегенерации исходников в kotlin, но если их реально много, то решение уже не оптимально, либо же по каким-то причинам не хочется этого делать.

В таком случае, стоит настроить maven особым образом, о чем я сейчас и расскажу

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

Начав поиск и решение проблемы, я понял, что что-то не то с компиляцией. В папке target/classes нет моих исходников java. Изучив разные материалы и ответы на stackoverflow я так и не нашел ответа и начал думать, подключив все чертоги своего разума и опыта

Бинго! Надо подключить плагин, который можно будет как-то настроить, что бы он все скомпилировал и положил в target.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/main/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Тут важным является блок configuration/sources/source, так как по умолчанию путь будет взят из build/sourceDirectory, а там у нас путь к исходникам kotlin, проект то у нас больше на нем.

Так же стоит настроить плагин kotlin-maven-plugin. Тут важной является секция configuration/sourceDirs

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>${kotlin_version}</version>
    <executions>
        <execution>
            <id>compile</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <sourceDirs>
                    <source>src/main/java</source>
                    <source>src/main/kotlin</source>
                </sourceDirs>
            </configuration>
        </execution>
...
    </executions>
</plugin>

Таким образом, все это будет работать так, как нужно, скомпилируется, котлин будет видеть код на java, и так же все попадет в jar файл, который соберет maven

Смотреть полный пример GitHub