我的项目布局如下:
src/
java
generated
src / java包含jpa实体和查询类,它们使用由hibernate metamodel annotation processor生成的jpa元模型类。
将注释处理合并到java插件的最佳方法是什么?
我目前定义了以下任务,但它对compileJava有一个任务依赖,这将失败,因为某些代码依赖于注释处理器生成的类。
task processAnnotations(type: Compile) {
genDir = new File("${projectDir}/src/generated")
genDir.mkdirs()
source = ['src/java']
classpath = sourceSets.test.compileClasspath
destinationDir = genDir
options.compilerArgs = ["-proc:only"]
}
答案 0 :(得分:6)
这是一个简单的设置,可以与netbeans无缝集成。 Javac将基本完成所需的所有工作,无需太多干预。其余的都是小型的,它们可以与像Netbeans这样的IDE一起使用。
apply plugin:'java'
dependencies {
// Compile-time dependencies should contain annotation processors
compile(group: 'org.hibernate...', name: '...', version: '...')
}
ext {
generatedSourcesDir = file("${buildDir}/generated-sources/javac/main/java")
}
// This section is the key to IDE integration.
// IDE will look for source files in both in both
//
// * src/main/java
// * build/generated-sources/javac/main/java
//
sourceSets {
main {
java {
srcDir 'src/main/java'
srcDir generatedSourcesDir
}
}
}
// These are the only modifications to build process that are required.
compileJava {
doFirst {
// Directory should exists before compilation started.
generatedSourcesDir.mkdirs()
}
options.compilerArgs += ['-s', generatedSourcesDir]
}
就是这样。 Javac将完成剩下的工作。
答案 1 :(得分:3)
processAnnotations
依赖于compileJava
的原因是你将测试编译类路径放在前任务的编译类路径上,而测试编译类路径包含编译后的生产代码(即输出compileJava
)。
至于如何最好地解决手头的问题,你不需要单独的编译任务。 Java编译器可以调用注释处理器并在一次传递中编译它们生成的源(以及原始源)(参见Annotation Processing)。您需要做的一件事是将注释处理器放在编译类路径上:
configurations {
hibernateAnnotationProcessor
}
dependencies {
hibernateAnnotationProcessor "org.hibernate: ..."
}
compileJava.compileClasspath += configurations.hibernateAnnotationProcessor
(您不希望将注释处理器添加到compile
配置中,因为它将被视为生产代码的依赖项。)
据我所知,这就是它的全部内容(假设您使用的是JDK6或更高版本)。
答案 2 :(得分:0)
从gradle 4.6开始,您只需要在适当的配置中定义处理器的依赖性:
dependencies {
...
annotationProcessor 'org.hibernate:hibernate-jpamodelgen:4.3.7.Final'
}
参考:https://docs.gradle.org/4.6/release-notes.html#added-annotationprocessor-configurations