Проблема с обработчиком аннотаций 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")
}

Михал, удалось ли найти решение?

psaw.mora 21.02.2019 16:23

просто обходной путь, описанный ниже в моем ответе.

Michal Plewka 19.04.2019 15:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
10 795
6

Ответы 6

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

Since implementation details matter for annotation processors, they must be declared separately on the annotation processor path. Gradle ignores annotation processors on the compile classpath.

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

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

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

Michal Plewka 25.12.2018 14:26

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

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

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

где именно нужно добавить этот блок? После добавления я получил это исключение: org.gradle.internal.metaobject.AbstractDynamicObject$CustomM‌​essageMissingMethodE‌​xception: Could not find method compileQuerydsl() for arguments [build_34f65uphys3x3neud0s7h85bz$_run_closure1$_closure14@47‌​966d1f] on root project 'my-project' of type org.gradle.api.Project

Darshan Mehta 10.06.2020 13:45

Это моя рабочая конфигурация для 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

Отличный первый ответ @niebaraka. FWIW более традиционной транзитивной зависимостью для процессора: jpa будет annotationProcessor("javax.persistence:javax.persistence-api‌​")

Emerson Farrugia 22.04.2019 12:42

@EmersonFarrugia Я не внимательно слежу за последними изменениями в мире EE, но мне кажется, что jakarta.* теперь предпочтительнее javax.*. По крайней мере, весенняя загрузка 2.0.0.M1 уже включает упомянутые зависимости, поэтому я тоже их использовал.

niebaraka 23.04.2019 21:06

согласились, хотя Spring Boot 2.2 будет использовать их, текущая спецификация зависимостей GA 2.1.4 не упоминает их

Emerson Farrugia 25.04.2019 12:16

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

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

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

Какая у вас версия Gradle?

Bhaumik Thakkar 16.12.2019 14:17

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

    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

Я не понял вашего комментария "обратите внимание на объявление зависимости". Мы предполагаем удалить зависимость Spring mongo?

Jesse 01.06.2020 16:40

Я столкнулся с той же проблемой для 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
}

Другие вопросы по теме