升级到Gradle 5后Querydsl注释处理器问题

时间:2018-12-24 12:10:14

标签: java gradle querydsl

我有一个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")
}

6 个答案:

答案 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
}