Gradle สร้างข้อมูลเมตา Querydsl สองครั้งผ่านตัวประมวลผลคำอธิบายประกอบที่แตกต่างกัน

ฉันมีสคริปต์สร้างการไล่ระดับ ฉันต้องการสคริปต์ดังกล่าวเพื่อสร้าง QueryDSL-Metadata ข้อมูลเมตาเหล่านั้นควรสร้างขึ้นภายใต้โฟลเดอร์ build/generated-sources/metamodel

ปัญหาที่ฉันกำลังเผชิญอยู่ในขณะนี้คือ metamodel ไม่เพียงถูกสร้างขึ้นเพียงครั้งเดียว แต่สองครั้ง นอกเหนือจากเป้าหมายที่ต้องการแล้ว ยังถูกสร้างขึ้นใน "default" buld/classes/... ส่งผลให้เกิดข้อผิดพลาด "คลาสที่ซ้ำกัน"

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
}

ตามการติดตามการไล่ระดับ ปัญหาดูเหมือนว่ามี AnnotatioProcessors สองตัวผสมกัน ขั้นแรก HibernateAnnotationProcessor ประการที่สอง JPAAnnotationProcessor ในที่สุดก็สร้างคลาสที่ซ้ำกัน และฉันไม่เข้าใจว่าทำไม สคริปต์บิลด์ก็ดูใช้ได้ ฉันรู้ว่ามันอาจจะเป็นการคาดเดา แต่ฉันก็ขอบคุณสำหรับข้อเสนอแนะใดๆ ฉันยังทำความสะอาดแคช gradle ของฉันด้วยในกรณีนี้ อาจไม่ใช่ปัญหาที่เกี่ยวข้องกับบิลด์สคริปต์ แต่พฤติกรรมยังคงมีอยู่แม้ว่าฉันจะเรียกใช้สคริปต์ผ่านคอนโซลก็ตาม

สรุปสาระสำคัญ โดยพื้นฐานแล้วคือสิ่งที่ฉัน "ควร" ต้องการ

(เก่ากว่า) โพสต์เกี่ยวกับปัญหานี้


person Nikolas    schedule 09.01.2017    source แหล่งที่มา


คำตอบ (1)


วิธีแก้ปัญหาของเธรดนี้ ใช้งานได้สำหรับฉัน แนวคิดคือการเชื่อมต่อ Annotation Processor เข้ากับ javac โดยที่ HibernateAnnotationProcessor สามารถประกาศได้ผ่าน compilerArgs โดยประมาณ : :

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

แต่ฉันยังคงสงสัยว่าเหตุใดแนวทางแรกจึงไม่ได้ผล (ใช้ตัวประมวลผลคำอธิบายประกอบสองตัว) ดังนั้นแนวคิดใดๆ ก็ตามยังคงได้รับการชื่นชมอย่างสูง

person Nikolas    schedule 10.01.2017