[英]Querydsl Annotation Processor issue after upgrade to Gradle 5
我有一個 gradle 腳本,它從 Mongo 注釋的實體生成 querydsl 類。 到目前為止它一直在工作,但是在升級到 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")
}
我終於找到了解決方法。 Querydsl 缺乏與 Gradle 5 的兼容性在此處報告為錯誤: https : //github.com/ewerk/gradle-plugins/issues/108
解決方法是添加到 gradle 腳本:
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
這是我在不使用其他插件的情況下對 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”后綴。
還請查看這兩個依賴項:
'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
我可以通過添加以下兩個依賴項來解決問題。
annotationProcessor "com.querydsl:querydsl-apt:4.2.1:jpa"
annotationProcessor 'javax.annotation:javax.annotation-api:1.3.1'
第二個依賴是一個隱藏的原因,為什么它對我不起作用。
我在使用 Gradle 6.6.1 的 Spring Boot Data JPA 和 Query DSL 時遇到了同樣的問題。 我在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
}
我正在使用的配置,它的工作原理:
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
我看到您的依賴項中有compile("com.querydsl:querydsl-apt:4.1.4")
。 根據文檔
由於實現細節對注釋處理器很重要,因此它們必須在注釋處理器路徑上單獨聲明。 Gradle 會忽略編譯類路徑上的注解處理器。
因此,將com.querydsl:querydsl-apt:4.1.4
放在annotationProcessor
范圍內。
順便說一句,考慮通過compile
切換到api
/ implementation
范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.