我有一个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,以防万一。它甚至可能不是纯粹的构建脚本相关问题,但即使我通过控制台运行脚本,行为也会持续存在。
答案 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']
}
但我仍然想知道为什么第一种方法不起作用(运行两个注释处理器),所以任何想法仍然受到高度赞赏。