我有一个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中发生了变化,默认情况下在编译过程中不使用注释处理器,并且应该添加注解处理器声明,但是当我将其添加到依赖项时,会发生相同的错误。
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")
}
答案 0 :(得分:4)
我终于找到了解决方法。 Querydsl与Gradle 5不兼容被报告为错误:https://github.com/ewerk/gradle-plugins/issues/108
解决方法是添加到gradle脚本中:
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
答案 1 :(得分:2)
这是我在不使用其他插件的情况下对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依赖项也包含到commentProcessor中。
生成的源位于\build\generated\sources\annotationProcessor\java\main
答案 2 :(得分:0)
我看到您的依存关系中有for item in given:
lst.append(item)
print(lst)
result.append(lst[:])
print (result)
# [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
。根据{{3}}
由于实现细节对于注释处理器至关重要,因此必须在注释处理器路径上分别声明它们。 Gradle忽略编译类路径上的注释处理器。
因此,将compile("com.querydsl:querydsl-apt:4.1.4")
放在com.querydsl:querydsl-apt:4.1.4
范围内。
顺便说一句,请考虑在annotationProcessor
上切换到the docs范围。
答案 3 :(得分:0)
我可以通过添加以下两个依赖项来解决该问题。
annotationProcessor "com.querydsl:querydsl-apt:4.2.1:jpa"
annotationProcessor 'javax.annotation:javax.annotation-api:1.3.1'
第二个依赖是它对我不起作用的一个隐藏原因。
答案 4 :(得分:0)
我正在使用的配置有效,
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
答案 5 :(得分:0)
使用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()
}
关键是查询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
}