Gradle通过不同的注释处理器生成两次Querydsl元数据

时间:2017-01-09 15:52:42

标签: java hibernate gradle querydsl

我有一个gradle构建脚本。我希望所述脚本生成QueryDSL-Metadata。应在 build / generated-sources / metamodel 文件夹下生成这些元数据。

我目前面临的问题是元模型不仅要生成一次,还要生成两次。除了期望的目标之外,它还在“默认” 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
}

根据gradle跟踪,问题似乎是混合中有两个AnnotatioProcessors。首先是HibernateAnnotationProcessor。第二,JPAAnnotationProcessor,最终生成重复的类。我无法弄清楚为什么,构建脚本看起来很好。我知道,这可能是猜测,但我很感激任何建议。我甚至清理了我的gradle-cache,以防万一。它甚至可能不是纯粹的构建脚本相关问题,但即使我通过控制台运行脚本,行为也会持续存在。

Gist, basically exactly what I "should" need

(older) Post regarding this issue

1 个答案:

答案 0 :(得分:0)

This thread's solution对我有用,我的想法是将Annotation Processor挂钩到 javac HibernateAnnotationProcessor 可以通过 compilerArgs声明 em>,大致如下:

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

但我仍然想知道为什么第一种方法不起作用(运行两个注释处理器),所以任何想法仍然受到高度赞赏。