Kotlin + Gradle Kotlin DSL + KAPT + MapStruct

Всем доброе время суток. Столкнулся с проблемой при попытке добавить функционал MapStruct в проект. Причем, ошибки появляются просто как снежный ком, одна за другой. Буду рад любой помощи. По порядку:

  1. Для начала, я не понимаю, почему Intellij IDEA не может корректно понять использование kapt. Собственно, все время выходит ошибка Unresolverd reference: kapt. В то же время IDE предлагает импортировать некий класс import org.jetbrains.kotlin.kapt3.base.Kapt.kapt, в результате, конструкцию kapt можно использовать в блоке dependencies, однако в качестве аргумента ожидается экземпляр класса KaptOptions, который, похоже, мне совсем не нужен. Если же убрать импорт - IDE ругается на unresolved reference: kapt, однако build проекта проходит успешно. Не скажу, что это критично, но сильно врезается в глаза и отвлекает. И вообще не хотелось бы иметь никаких "красных" файлов, к тому же IDE постоянно предлагает сделать импорт "красного" kapt, что тоже неудобно.

  2. В проекте имеется сущность System. При попытке выполнить gradle clean build выходит ошибка: e: <path_to_class>\System.java:3: error: System is already defined in this compilation unit import java.lang.System; Никакого импорта java.lang.System в классе сущности System (да и в принципе нигде более) не имеется. Если переименовать сущность, например в Systemm - ошибка исчезает, но не хотелось бы прибегать к такому методу.

    package com.sprojects.core.server.model.entity

    import java.util.Date
    import javax.persistence.Column
    import javax.persistence.Entity
    import javax.persistence.FetchType
    import javax.persistence.Id
    import javax.persistence.JoinColumn
    import javax.persistence.ManyToOne
    import javax.persistence.OneToMany
    import javax.persistence.PreUpdate
    import javax.persistence.Table
    import javax.persistence.Temporal
    import javax.persistence.TemporalType

    @Entity
    @Table(name = "systems")
    data class System(
        // ... Some fields here ... //
    ) {
       // ... Some code here //
    }
  1. Не создаются реализации мапперов MapStruct. Видимо, этот вопрос тесно связан с вопросом 2, но тем не менее никак не получается это решить. Пытаюсь получить маппер: val mapper = Mappers.getMapper(MyConverter::class.java). Ошибка: java.lang.ClassNotFoundException: Cannot find implementation for com.sprojects.core.server.model.dto.impl.MyConverter. Содержимое build.gradle.kts*:
    plugins {
        // kotlin
        id("kotlin")
        kotlin("jvm")
        kotlin("kapt")
        kotlin("plugin.spring")
        kotlin("plugin.jpa")
        // Spring
        id("org.springframework.boot")
        id("io.spring.dependency-management")
        // Other
        id("idea")
        id("com.palantir.docker")
        id("org.jlleitschuh.gradle.ktlint")
        id("net.ltgt.apt") version "0.21"
        id("net.ltgt.apt-idea") version "0.21"
    }

    group = "${rootProject.group}"
    version = "${rootProject.version}"
    java.sourceCompatibility = JavaVersion.VERSION_1_8
    java.targetCompatibility = JavaVersion.VERSION_1_8

    configurations {
        compileOnly {
            extendsFrom(configurations.annotationProcessor.get())
        }
    }

    repositories {
        mavenCentral()
        jcenter()
    }

    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("org.springframework.boot:spring-boot-starter-actuator")
        implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
        implementation("org.springframework.boot:spring-boot-starter-data-jpa")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.postgresql:postgresql")
        implementation("io.jsonwebtoken:jjwt:${rootProject.extra["jwtVersion"]}")
        implementation("org.springframework.boot:spring-boot-starter-security")
        implementation("org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:${rootProject.extra["springBootVersion"]}")
        implementation("org.springframework.security:spring-security-jwt:${rootProject.extra["springSecurityJwtVersion"]}")
        implementation("org.springframework.boot:spring-boot-configuration-processor")

        testImplementation("org.springframework.boot:spring-boot-starter-test")
        testImplementation("org.springframework.security:spring-security-test")
        testImplementation("org.testcontainers:testcontainers:${rootProject.extra["testContainersVersion"]}")
        testImplementation("org.testcontainers:postgresql:${rootProject.extra["testContainersVersion"]}")
        testImplementation("org.springframework.security:spring-security-test")

        implementation(
            group = "io.springfox",
            name = "springfox-swagger2",
            version = "${rootProject.extra["swagger2Version"]}"
        )
        implementation(
            group = "io.springfox",
            name = "springfox-swagger-ui",
            version = "${rootProject.extra["swagger2Version"]}"
        )
        implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
        implementation(
            group = "org.mapstruct",
            name = "mapstruct",
            version = "${rootProject.extra["mapStructVersion"]}"
        )
        // При такой попытке не работает сборка проекта
        kapt("org.mapstruct:mapstruct-processor:${rootProject.extra["mapStructVersion"]}")

        // При такой попытке работает сборка, но не создаются реализации мапперов
        /*annotationProcessor(
            group = "org.mapstruct",
            name = "mapstruct-processor",
            version = "${rootProject.extra["mapStructVersion"]}"
        )*/
    }

Буду рад любой оказанной помощи, если нужно предоставить еще какие-то данные - предоставлю. Спасибо.

UPDATED. Вопрос 1 не актуален. Помогла подсказка IDE: Apply Context.


Ответы (2 шт):

Автор решения: Сергей Фролов

В проекте имеется сущность System. При попытке выполнить gradle clean build выходит ошибка: e: \System.java:3: error: System is already defined in this compilation unit import java.lang.System; Никакого импорта java.lang.System в классе сущности System (да и в принципе нигде более) не имеется. Если переименовать сущность, например в Systemm - ошибка исчезает, но не хотелось бы прибегать к такому методу.

Данный импорт добавляется при генерации кода и поэтому возникает конфликт. Предлагаю попробовать явно указать импорт java.lang.System определив для него другой псевдоним.

import java.lang.System as javaLangSystem
→ Ссылка
Автор решения: titaniche

Как и было сказано, вопрос 3 полностью зависит от вопроса 2.

В результате совершил два действия:

  1. Добавил файл gradle.properties в корень проекта:
    kapt.include.compile.classpath=false
    kapt.use.worker.api=true
  1. Добавил дополнительную конфигурацию в build.gradle.kts :
    kapt {
        correctErrorTypes = true
    }

На всякий случай: https://kotlinlang.org/docs/reference/kapt.html

→ Ссылка