3

我有一个项目,布局如下:

src/
  java
  generated

src/java 包含使用由hibernate 元模型注释处理器生成的 jpa 元模型类的 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"]
}
4

3 回答 3

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 将完成剩下的工作。

于 2014-04-22T11:32:29.057 回答
3

之所以processAnnotations依赖,compileJava是因为你把测试编译类路径放在了前一个任务的编译类路径上,而测试编译类路径包含了编译后的生产代码(即输出compileJava)。

至于如何最好地解决手头的问题,您不需要单独的编译任务。Java 编译器可以调用注解处理器并一次编译它们生成的源代码(连同原始源代码)(请参阅注解处理)。您需要做的一件事是将注释处理器放在编译类路径上:

configurations {
    hibernateAnnotationProcessor
}

dependencies {
    hibernateAnnotationProcessor "org.hibernate: ..."
}

compileJava.compileClasspath += configurations.hibernateAnnotationProcessor

(您不想将注释处理器添加到compile配置中,因为那样它将被视为生产代码的依赖项。)

据我所知,这就是它的全部内容(假设您使用的是 JDK6 或更高版本)。

于 2012-07-08T20:38:52.697 回答
1

从 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

于 2018-12-14T17:14:47.547 回答