Проблема с обработчиком аннотаций Querydsl после обновления до Gradle 5

У меня есть скрипт gradle, который генерирует классы querydsl из аннотированных объектов Mongo. До сих пор он работал, но после обновления до Gradle 5 у меня возникла проблема:

* What went wrong:
Execution failed for task ':myproject-common:compileQuerydsl'.
Annotation processor 'org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor' not found

Пожалуйста, найдите мой скрипт gradle.build ниже. Есть идеи, что может быть не так? Я читал, что в Gradle 5 было изменение, заключающееся в том, что процессоры аннотаций не используются по умолчанию во время компиляции, и следует добавить объявление annotationProcessor, но когда я добавляю его в зависимости, возникает та же ошибка.

plugins {
    id 'org.springframework.boot' version '2.0.4.RELEASE'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
repositories {
    mavenCentral()
}
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
jar {
    enabled = true
    baseName = 'myproject-common'
    version =  '0.0.1-SNAPSHOT'
}
// do no package commons into fat jar
bootJar {
    enabled = false
}
querydsl {
    library = 'com.querydsl:querydsl-apt:4.1.4'
    querydslSourcesDir = 'src/main/querydsl'
    springDataMongo = true
}
sourceCompatibility = 11.0
targetCompatibility = 11.0
sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', 'src/main/querydsl']
        }
    }
}
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.data:spring-data-mongodb")
    compile("org.springframework.boot:spring-boot-starter-data-rest")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("com.fasterxml.jackson.datatype:jackson-datatype-    jsr310:2.8.6")
    compile("com.google.guava:guava:23.0")
    compile("commons-io:commons-io:2.5")
    compile("org.aspectj:aspectjweaver:1.8.9")
    compile("org.apache.commons:commons-lang3:3.5")
    compile("commons-collections:commons-collections:3.2.2")
    compile("org.javamoney:moneta:1.1")
    compile("com.fizzed:rocker-runtime:1.2.0")
    compile("com.querydsl:querydsl-core:4.1.4")
    compile("com.querydsl:querydsl-mongodb:4.1.4")
    compile("com.querydsl:querydsl-apt:4.1.4")
    compile("com.codepoetics:protonpack:1.15")

    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.assertj:assertj-core:3.7.0")
}

person Michal Plewka    schedule 24.12.2018    source источник
comment
Михал, удалось найти решение?   -  person psaw.mora    schedule 21.02.2019
comment
просто обходной путь, описанный ниже в моем ответе.   -  person Michal Plewka    schedule 19.04.2019


Ответы (6)


Наконец-то я нашел обходной путь. Отсутствие совместимости Querydsl с Gradle 5 сообщается здесь как ошибка: https://github.com/ewerk/gradle-plugins/issues/108

Обходной путь - добавить в скрипт gradle:

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
person Michal Plewka    schedule 26.12.2018
comment
где именно нам нужно добавить этот блок? После добавления я получил это исключение: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method compileQuerydsl() for arguments [build_34f65uphys3x3neud0s7h85bz$_run_closure1$_closure14@47966d1f] on root project 'my-project' of type org.gradle.api.Project - person Darshan Mehta; 10.06.2020

Это моя рабочая конфигурация для JPA без использования дополнительных плагинов. Gradle 5.3, openjdk 11.0.2.

plugins {
    id 'java-library'
}

ext {
    springBootVersion = '2.2.0.M1'
    queryDslVersion = '4.2.1'
}

dependencies {
    api(
            "com.querydsl:querydsl-jpa:$queryDslVersion"
    )

    implementation(
            platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion"),
            'org.springframework.boot:spring-boot-starter-validation',
            'org.springframework.boot:spring-boot-starter-data-jpa',
            'org.liquibase:liquibase-core',
            'org.postgresql:postgresql'
    )

    annotationProcessor(
            platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion"),
            'jakarta.persistence:jakarta.persistence-api',
            'jakarta.annotation:jakarta.annotation-api',
            "com.querydsl:querydsl-apt:$queryDslVersion:jpa"

    )
}

Обратите внимание на обработчик аннотаций. Он имеет суффикс: jpa. Наверное, это то, что вы упустили. Чтобы активировать его для mongodb, вы должны добавить суффикс ": morphia".

Также обратите внимание на эти 2 зависимости:

'jakarta.persistence:jakarta.persistence-api'
'jakarta.annotation:jakarta.annotation-api'

Это обходной путь для проблемы, описанной здесь: https://discuss.gradle.org/t/annotationprocessor-querydsl-java-lang-noclassdeffounderror/27107 Они должны быть транзитивными зависимостями обработчика аннотаций, но это еще не так. Возможно, вам также придется включить некоторые зависимости mongo в annotationProcessor. Сгенерированные источники находятся в \build\generated\sources\annotationProcessor\java\main

person niebaraka    schedule 07.04.2019
comment
Отличный первый ответ @niebaraka. FWIW более традиционная транзитивная зависимость для процессора: jpa будет annotationProcessor("javax.persistence:javax.persistence-api") - person Emerson Farrugia; 22.04.2019
comment
@EmersonFarrugia Я не внимательно слежу за последними изменениями в мире EE, но, похоже, jakarta.* теперь предпочтительнее, чем javax.* По крайней мере, весенняя загрузка 2.0.0.M1 уже включает упомянутые зависимости, поэтому я тоже использовал их. - person niebaraka; 23.04.2019
comment
согласился, хотя Spring Boot 2.2 будет использовать их, текущая спецификация зависимостей GA 2.1.4 не упоминает их - person Emerson Farrugia; 25.04.2019

Я столкнулся с той же проблемой для Spring Boot Data JPA и Query DSL с Gradle 6.6.1. Я перепробовал так много всего в моем build.gradle файле, включая некоторые предложения в других ответах на этот вопрос. Мне удалось создать build.gradle файл с минимальным набором дополнений к стандартному файлу сборки (стандартному в смысле того, что генерируется https://start.spring.io). Вот:

plugins {
    id 'org.springframework.boot' version '2.4.0'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
    id 'com.ewerk.gradle.plugins.querydsl' version "1.0.10"
}

group = 'org.code'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

querydsl {
    querydslDefault = true
    jpa = true
}

configurations {
    querydsl.extendsFrom implementation
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

ext {
    queryDslVersion = '4.4.0'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

Ключевым дополнением является плагин Query DSL:

id 'com.ewerk.gradle.plugins.querydsl' version "1.0.10"

Однако одного этого недостаточно. Другие важные дополнения:

querydsl {
    querydslDefault = true
    jpa = true
}

configurations {
    querydsl.extendsFrom implementation
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
person Casper    schedule 30.11.2020

Я мог бы решить проблему, добавив две следующие зависимости.

annotationProcessor "com.querydsl:querydsl-apt:4.2.1:jpa"
annotationProcessor 'javax.annotation:javax.annotation-api:1.3.1'

Вторая зависимость была скрытой причиной, по которой у меня это не сработало.

person Michael    schedule 29.07.2019
comment
Какая у вас версия Gradle? - person Bhaumik Thakkar; 16.12.2019

Конфигурация, которую я использую, работает:

    plugins {
    id 'org.springframework.boot' version '2.2.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"

}

group = 'io.loremipsum'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'


repositories {
    mavenCentral()
}


querydsl {
    library = 'com.querydsl:querydsl-apt:4.1.4'
    querydslSourcesDir = 'src/main/querydsl'
    springDataMongo = true
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', 'src/main/querydsl']
        }
    }
}
// is required when gradle > 5.0
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-data-mongodb'
    compile 'org.springframework.boot:spring-boot-starter-web'

    compile("com.querydsl:querydsl-core:4.1.4")
    compile("com.querydsl:querydsl-mongodb:4.1.4")
    compile("com.querydsl:querydsl-apt:4.1.4")

    compile 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
}

обратите внимание на объявление зависимости :

compile 'org.springframework.boot:spring-boot-starter-data-mongodb'

Зависимость реализации не должна использоваться или приведет к исключению:

Annotation processor 'org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor' not found
person LoremIpsum    schedule 17.05.2020
comment
Я не понял вашего комментария, обратите внимание на объявление зависимости. Мы предполагаем удалить зависимость Spring mongo? - person Jesse; 01.06.2020

Я вижу, что у вас compile("com.querydsl:querydsl-apt:4.1.4") в ваших зависимостях. Согласно документам

Поскольку детали реализации имеют значение для процессоров аннотаций, они должны быть объявлены отдельно в пути к процессору аннотаций. Gradle игнорирует обработчики аннотаций в пути к классам компиляции.

Итак, поместите com.querydsl:querydsl-apt:4.1.4 в область annotationProcessor.

Кстати, подумайте о переходе на api / implementation области над compile.

person madhead    schedule 25.12.2018
comment
спасибо за быстрый ответ, я добавил две строчки annotationProcessor "com.querydsl:querydsl-apt:4.1.4" annotationProcessor "org.springframework.data:spring-data-mongodb", но это не помогло, и ошибка та же. У тебя есть другие идеи? - person Michal Plewka; 25.12.2018