Querydsl Annotation Processor issue after upgrade to Gradle 5

后端 未结 6 1116
孤独总比滥情好
孤独总比滥情好 2021-01-02 19:13

I have a gradle script which generates querydsl classes from Mongo annotated entities. It was working so far, but after upgrade to Gradle 5 I have a problem with:

         


        
相关标签:
6条回答
  • 2021-01-02 19:48

    I faced the same issue for Spring Boot Data JPA and Query DSL with Gradle 6.6.1. I tried so many things in my build.gradle file, including some of the suggestions in other responses to this question. I was able to come up with a build.gradle file with a minimal set of additions to the standard build file (standard in the sense of the one generated by https://start.spring.io). Here it is:

    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()
    }
    

    The key addition is the Query DSL plugin:

    id 'com.ewerk.gradle.plugins.querydsl' version "1.0.10"
    

    However, it is not enough on its own. Other important additions are:

    querydsl {
        querydslDefault = true
        jpa = true
    }
    
    configurations {
        querydsl.extendsFrom implementation
    }
    
    compileQuerydsl {
        options.annotationProcessorPath = configurations.querydsl
    }
    
    0 讨论(0)
  • 2021-01-02 19:50

    The configuration i am using,it works:

        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'
    }
    

    pay attention to the dependency declaration:

    compile 'org.springframework.boot:spring-boot-starter-data-mongodb'
    

    implementation dependency should not be used or will result in an exception:

    Annotation processor 'org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor' not found
    
    0 讨论(0)
  • 2021-01-02 19:52

    I see you have compile("com.querydsl:querydsl-apt:4.1.4") in your dependencies. According to the docs

    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.

    So, put com.querydsl:querydsl-apt:4.1.4 in the annotationProcessor scope.

    BTW, consider switching to api / implementation scopes over compile.

    0 讨论(0)
  • 2021-01-02 19:52

    I could solve the problem by adding the following two dependencies.

    annotationProcessor "com.querydsl:querydsl-apt:4.2.1:jpa"
    annotationProcessor 'javax.annotation:javax.annotation-api:1.3.1'
    

    The second dependency was a hidden reason why it not worked for me.

    0 讨论(0)
  • 2021-01-02 19:54

    This is my working configuration for JPA without using additional plugins. 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"
    
        )
    }
    

    Please pay attention to the annotation processor. It has suffix ":jpa". Probably this is what you missed. To activate the same one for mongodb you should add ":morphia" suffix.

    Please also look at these 2 dependencies:

    'jakarta.persistence:jakarta.persistence-api'
    'jakarta.annotation:jakarta.annotation-api'
    

    This is a workaround for the issue described here: https://discuss.gradle.org/t/annotationprocessor-querydsl-java-lang-noclassdeffounderror/27107 They should be transitive dependencies of the annotation processor, but they aren't yet. Probably you will have to include some mongo dependencies to annotationProcessor too. Generated sources are located in \build\generated\sources\annotationProcessor\java\main

    0 讨论(0)
  • 2021-01-02 20:07

    I have finally found a workaround. Querydsl's lack of compatibility with Gradle 5 is reported here as a bug: https://github.com/ewerk/gradle-plugins/issues/108

    Workaround is to add to gradle script:

    compileQuerydsl {
        options.annotationProcessorPath = configurations.querydsl
    }
    
    0 讨论(0)
提交回复
热议问题