У меня есть скрипт 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")
}
просто обходной путь, описанный ниже в моем ответе.




Я вижу, что у вас есть 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", но это не помогло, и ошибка та же. У тебя есть другие идеи?
Наконец-то я нашел обходной путь. Об отсутствии совместимости Querydsl с Gradle 5 сообщается здесь как об ошибке: https://github.com/ewerk/gradle-plugins/issues/108
Обходной путь - добавить в скрипт gradle:
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
где именно нужно добавить этот блок? После добавления я получил это исключение: 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
Это моя рабочая конфигурация для 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")
@EmersonFarrugia Я не внимательно слежу за последними изменениями в мире EE, но мне кажется, что jakarta.* теперь предпочтительнее javax.*. По крайней мере, весенняя загрузка 2.0.0.M1 уже включает упомянутые зависимости, поэтому я тоже их использовал.
согласились, хотя Spring Boot 2.2 будет использовать их, текущая спецификация зависимостей GA 2.1.4 не упоминает их
Я мог бы решить проблему, добавив две следующие зависимости.
annotationProcessor "com.querydsl:querydsl-apt:4.2.1:jpa"
annotationProcessor 'javax.annotation:javax.annotation-api:1.3.1'
Вторая зависимость была скрытой причиной, по которой у меня это не сработало.
Какая у вас версия Gradle?
Конфигурация, которую я использую, работает:
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?
Я столкнулся с той же проблемой для 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
}
Михал, удалось ли найти решение?