MapStruct с Gradle и затмение не работает - PullRequest
0 голосов
/ 18 сентября 2018

Создано приложение 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 ()}

Но все еще не работает.Пожалуйста, проверьте, чего не хватает.

1 Ответ

0 голосов
/ 18 сентября 2018

Похоже, что сгенерированные источники не включаются автоматически в classpath приложения.

Сделал снимок на семпл на github , и он работает нормально.

Используйте ту же конфигурацию gradle, что и в примере для вашего приложения:

...