Mapstruct AnnotationProcessor с IntelliJ и Gradle - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь заставить процессор аннотаций Mapstruct работать в IntelliJ в проекте Gradle.

В идеале я ожидал бы, что вся конфигурация будет в файле gradle, и что любой может просто импортировать проектв IntelliJ и получите полную настройку без необходимости устанавливать какие-либо предпочтения вручную.

Но я согласен с компромиссами по этому вопросу.

Я использую IntelliJ 2018.3 и Gradle 5.0 с Java 11 (то естьпоследний и самый большой).Версия Mapstruct - 1.2.0.FINAL.

Что я сделал:

  • Настроил процессор аннотаций Mapstruct в моем build.gradle:

    compile "org.mapstruct:mapstruct-jdk8:${mapstruct_version}"
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapstruct_version}"
    
  • Выбранный «Делегировать IDE для сборки / запуска действий на Gradle» в Предпочтениях в разделе «Сборка, выполнение, развертывание -> Инструменты сборки -> Gradle -> Runner»

В каталоге build/classes/java/main/com/myapp/mypackage/mapper/ я вижу MyMapperImpl.class и MyMapperImpl.java, поэтому кажется, что генерация кода работает.

Теперь я ожидаю, что когда я выберу свой аннотированный абстрактный класс MyMapper инажмите ctrl H , чтобы сгенерированный MyMapperImpl появился в иерархическом представлении.

Если я вручную отмечу build/classes/java/main/ как каталог "сгенерированных источников" (которыйЯ действительно не хочу этого делать, см. Выше), класс по-прежнему не отображается в иерархии.Но исходный код помечен множеством ошибок, так как, по-видимому, классы из моего проекта не найдены.

Само собой разумеется: я могу безошибочно запускать тесты, использующие маппер, как из IntelliJ, так и из командной строки..

1 Ответ

0 голосов
/ 17 декабря 2018

Используйте это , моя команда также использует mapstruct, и мы используем его в нашем build.gradle , вам нужно будет привезти плагин ideaа также для gradle

def generatedSources = "$buildDir/generated"
def generatedOutputDir = file("$generatedSources")

/*
 create generated .java files in different folder than classes
 In IntelliJ 2016.3.x: Enable Annotation Processing, then set generated sources,
 relative to module output dir, at path '../../generated'
 */
compileJava {
    doFirst {
        generatedOutputDir.exists() || generatedOutputDir.mkdirs()
        options.compilerArgs = [
                '-s', "${generatedSources}"
        ]
    }
}


idea {
    module {
        downloadSources = true
        // tell intellij where to find generated sources
        sourceDirs += generatedOutputDir
    }
}

Вы сможете запустить свой код даже без Gradle runner с помощью этого обходного пути

...