Kotlin + Gradle Kotlin DSL + KAPT + MapStruct
Всем доброе время суток. Столкнулся с проблемой при попытке добавить функционал MapStruct в проект. Причем, ошибки появляются просто как снежный ком, одна за другой. Буду рад любой помощи. По порядку:
Для начала, я не понимаю, почему 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, что тоже неудобно.В проекте имеется сущность 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 //
}
- Не создаются реализации мапперов 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
Как и было сказано, вопрос 3 полностью зависит от вопроса 2.
В результате совершил два действия:
- Добавил файл gradle.properties в корень проекта:
kapt.include.compile.classpath=false
kapt.use.worker.api=true
- Добавил дополнительную конфигурацию в build.gradle.kts :
kapt {
correctErrorTypes = true
}
На всякий случай: https://kotlinlang.org/docs/reference/kapt.html