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



我有一个gradle构建脚本。我想说的脚本生成QueryDSL元数据。这些元数据应该在构建/生成的源/元模型文件夹下生成。

我目前面临的问题是,元模型不仅生成了一次,而且生成了两次。除了所需的目标,它还在"默认">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
}

根据渐变跟踪,问题似乎是混合中有两个AnnotationProcessors。首先是Hibernate AnnotationProcessor。第二,JPAAnnotationProcessor,最终生成重复的类。我不明白为什么,构建脚本看起来还可以。我知道,这可能只是猜测,但我很感激任何建议。我甚至清理了我的gradle缓存,以防万一。这甚至可能不是一个纯粹的与构建脚本相关的问题,但即使我通过控制台运行脚本,这种行为仍然存在。

Gist,基本上正是我"应该"需要的

(旧)关于这个问题的帖子

这个线程的解决方案对我来说很有效,其想法是将Annotation Processor挂接到javac中,Hibernate AnnotationProcessor可以通过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']
}

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

最新更新