Переход с Gradle 4 на 5. Как заставить mapstruct 1.20.final работать с ним

Мы используем mapstruct 1.20.final примерно 1,5 года с различными версиями Gradle — последняя версия 4.10.2. Мы хотим перейти на Gradle 5.4.1, который работает со всем, кроме mapstruct. Наша рабочая установка не была чистой. Поэтому решил начать заново. Старая рабочая установка была гибридной формой example на Github и теперь устаревшие настройки.

Начал снова с http://mapstruct.org/news/2013-07-08-using-mapstruct-with-gradle в качестве основы. Есть сильное ощущение, что это НЕ совместимо с Gradle 5. Примечания к выпуску Gradle 5 заявляет: Gradle больше не будет автоматически применять процессоры аннотаций, которые находятся в пути к классам компиляции — вместо этого используйте CompileOptions.annotationProcessorPath. Пытался сделать это, как описано в https://blog.gradle.org/incremental-compiler-avoidance#about-annotation-processors. Это работает для 4.10.2. В Gradle 5 это приводит к следующей ошибке: Не удалось выполнить задачу ':eu.educator.rest:compileJava'. Невозможно указать -processorpath или --processor-path через CompileOptions.compilerArgs. Вместо этого используйте свойство CompileOptions.annotationProcessorPath.

У нас многопроектная установка. В проекте «остальные» очищенный build.gradle выглядит так:

plugins {
    id 'net.ltgt.apt' version '0.21'
}

configurations {
        apt
}

dependencies {
    apt libraries.mapstruct_processor
    compileOnly libraries.mapstruct_processor
}

compileJava {
    options.annotationProcessorPath = configurations.apt
}

Пробовал несколько настроек за последние 1,5 дня. НЕ могу заставить его работать. Поэтому, если у кого-то есть mapstruct, работающая с Gradle 5, я был бы очень признателен за рабочий build.gradle, подсказки, указатели.

PS. Как я могу заменить следующее версией, совместимой с Gradle 5.

tasks.withType(JavaCompile) {
    options.compilerArgs = [
            '-Amapstruct.suppressGeneratorTimestamp=true'
    ]
}

person Community    schedule 16.05.2019    source источник


Ответы (1)


Начиная с последней версии Gradle ( >= 4.8, я бы сказал), вы можете упростить свой скрипт сборки следующим образом: вам больше не нужен apt плагин, просто используйте annotationProcessor конфигурацию Gradle:

ext{
    mapstructVersion = "1.2.0.Final"
}
dependencies{
    // ...
    // --- Mapstruct ---------------------------------
    compileOnly("org.mapstruct:mapstruct-jdk8:${mapstructVersion}")
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
}
compileJava {
    options.annotationProcessorPath = configurations.annotationProcessor

    // if you need to configure mapstruct component model
    options.compilerArgs << "-Amapstruct.defaultComponentModel=spring" 
}

Примечание: по умолчанию Gradle будет генерировать исходники в директорию :build/generated/sources/annotationProcessor/java/main

Но это настраивается, например:

compileJava { 
   // ...
   options.setAnnotationProcessorGeneratedSourcesDirectory( file("$projectDir/src/generated/java"))
person M.Ricciuti    schedule 16.05.2019
comment
Большое спасибо за ответ, сразу же попробую. - person ; 16.05.2019
comment
Работал как шарм. Также очень ценится ваше обновление относительно изменения выходного каталога. Теперь все на том же месте, что и раньше. Все юнит-тесты зеленые (gradle и eclipse). Я приветствую вас. - person ; 16.05.2019
comment
Сразу попробовал, но получил такое сообщение: Спасибо за отзыв! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют публично отображаемый результат публикации. Не хотел использовать мою личную учетную запись github и создал новую учетную запись SO, используя адрес электронной почты моей фирмы. - person ; 16.05.2019
comment
Возможно, вы могли бы ответить еще на один вопрос: в старом коде мы использовали следующее: tasks.withType(JavaCompile) { options.compilerArgs = [ '-Amapstruct.suppressGeneratorTimestamp=true'] } Вы предложили: compileJava { options.compilerArgs << "-Amapstruct.defaultComponentModel=spring" } Я могу найти только запись JavaDoc для tasks.withType — никаких пользовательских документов. JavaDoc не прояснил для меня ситуацию... Могу я спросить, в чем разница между ними и когда мне следует использовать конкретную. В моем случае оба работают одинаково. - person ; 16.05.2019
comment
оба обозначения аналогичны. вы можете увидеть разные примеры в этом SO: stackoverflow.com/questions/29593500/ - person M.Ricciuti; 16.05.2019