簡體   English   中英

升級到 Gradle 5 后的 Querydsl 注釋處理器問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM