Gradle menghasilkan metadata Querydsl dua kali melalui pemroses anotasi yang berbeda

Saya memiliki skrip build gradle. Saya ingin skrip tersebut menghasilkan QueryDSL-Metadata. Metadata tersebut harus dibuat di dalam Folder build/generated-sources/metamodel.

Masalah yang saya hadapi saat ini adalah metamodel tidak hanya dihasilkan satu kali, tetapi dua kali. Bersamaan dengan target yang diinginkan, target tersebut juga dibuat di buld/classes/... "default" yang mengakibatkan kesalahan "kelas duplikat".

sourceSets {
    generated.java.srcDirs=['build/generated-sources/metamodel']
    main {
        java { srcDir 'src/main/java' }
    }
    test {
        java { srcDir 'src/main/test' }
    }
}

configurations { querydslapt }

dependencies {
    compile 'org.hibernate:hibernate-entitymanager:5.2.3.Final',
            'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final-redhat-1',
            'com.querydsl:querydsl-jpa:4.1.3',
            // ... others, non-hibernate/querydsl ...
    querydslapt 'com.querydsl:querydsl-apt:4.1.3'
}

task generateSources(type: JavaCompile, group: 'build', description:'Generates the QueryDSL query types') {
    source = sourceSets.main.java
    classpath = configurations.compile + configurations.querydslapt
    options.compilerArgs = ['-proc:only',
                            '-processor', 'com.querydsl.apt.hibernate.HibernateAnnotationProcessor']
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next()
}

compileJava {
    dependsOn generateSources
    source generateSources.destinationDir
}

Menurut jejak gradle, Masalahnya tampaknya ada dua AnnotatioProcessors dalam campuran. Pertama, HibernateAnnotationProcessor. Kedua, JPAAnnotationProcessor, yang pada akhirnya menghasilkan kelas duplikat. Dan saya tidak tahu mengapa, skrip build terlihat oke. Saya tahu, ini mungkin hanya dugaan, tapi saya berterima kasih atas saran apa pun. Saya bahkan membersihkan cache gradle saya, untuk berjaga-jaga. Ini bahkan mungkin bukan masalah murni terkait skrip build, tetapi perilaku tersebut tetap ada meskipun saya menjalankan skrip melalui konsol.

Intinya, pada dasarnya itulah yang "seharusnya" saya perlukan

Postingan (lama) mengenai masalah ini


person Nikolas    schedule 09.01.2017    source sumber


Jawaban (1)


Solusi thread ini berfungsi untuk saya, idenya adalah untuk menghubungkan Prosesor Anotasi ke dalam javac, HibernateAnnotationProcessor dapat dideklarasikan melalui compilerArgs, kira-kira seperti :

dependencies {
    compile 'org.hibernate:hibernate-entitymanager:5.2.3.Final',
            'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final-redhat-1',          
            'com.querydsl:querydsl-jpa:4.1.4',
            'com.querydsl:querydsl-apt:4.1.4',
            // other
}

ext {
    generatedSourcesDir = file("build/generated-sources/metamodel")
}

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir generatedSourcesDir
        }
    }
    test {
        java { srcDir 'src/main/test' }
    }
}

compileJava {
    doFirst {
        generatedSourcesDir.mkdirs()
    }
    options.compilerArgs += ['-s', generatedSourcesDir,
                             '-processor', 'com.querydsl.apt.hibernate.HibernateAnnotationProcessor']
}

Namun saya masih bertanya-tanya mengapa pendekatan pertama tidak berhasil (menjalankan dua pemroses anotasi), jadi ide apa pun masih sangat dihargai.

person Nikolas    schedule 10.01.2017