Создано приложение Gradle с использованием SpringBoot с MapStruct.
Файл Build.gradle содержит следующую запись.
dependencies {
compile "org.mapstruct:mapstruct-jdk8:${mapstructVersion}"
testCompile 'org.testng:testng:6.10', 'org.easytesting:fest-assert:1.4'
compile "org.mapstruct:mapstruct-processor:${mapstructVersion}"
}
plugins {
id 'java'
id 'net.ltgt.apt-eclipse' version '0.18'
}
Класс Mapper
@Mapper(componentModel="spring")
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);
@Mapping(source = "qax", target = "baz")
@Mapping(source = "baz", target = "qax")
Target sourceToTarget(Source source);
@InheritInverseConfiguration
Source targetToSource(Target target);
}
Файл Impl создается в папке сборки, но во время выполнения кода появляется ошибка:
Исключение в потоке "main" java.lang.ExceptionInInitializerError в org.mapstruct.example.app.main (app.java:7). Причина: java.lang.RuntimeException: java.lang.ClassNotFoundException: Не удалось найти реализацию для org.mapstruct.example.SourceTargetMapper в org.mapstruct.factory.Mappers.getMapper (Mappers.java:68) в org.mapstruct.example.SourceTargetMapper. (SourceTargetMapper.java:29) ... 1больше Причина: java.lang.ClassNotFoundException: Не удается найти реализацию для org.mapstruct.example.SourceTargetMapper в org.mapstruct.factory.Mappers.getMapper (Mappers.java:85) в org.mapstruct.factory.Mappers.getMapper (Mappers.java: 65)
Если я переместу файл Impl из папки bin папки Build, он будет работать нормально.Это означает, что MapStruct создает файл реализации в папке сборки и пытается получить к нему доступ из папки bin.
Как изменить расположение файлов сборки в папке bin?
Хорошо работает с проектом Maven с M2eПлагин, но не с Gradle.
Файл Build.gradle после предложенного изменения.
plugins {
id 'java'
id 'net.ltgt.apt-eclipse' version '0.18'
}
repositories {
mavenCentral()
mavenLocal()
}
task wrapper(type: Wrapper) { gradleVersion = '3.4' }
ext {
mapstructVersion = "1.2.0.Final"
javaLanguageLevel = '1.8'
generatedMapperSourcesDir = "${buildDir}/generated-src/mapstruct/main"
}
sourceCompatibility = rootProject.javaLanguageLevel
sourceSets.main {
ext.originalJavaSrcDirs = java.srcDirs
java.srcDir "${generatedMapperSourcesDir}"
}
dependencies {
compile "org.mapstruct:mapstruct-jdk8:${mapstructVersion}"
testCompile 'org.testng:testng:6.10', 'org.easytesting:fest-assert:1.4'
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
}
tasks.withType(JavaCompile) {
options.compilerArgs = ['-Amapstruct.suppressGeneratorTimestamp=true']
}
test {useTestNG ()}
Но все еще не работает.Пожалуйста, проверьте, чего не хватает.