在 Gradle 中使用 Annotation Processing Tool | Vert.x Codegen 示例

在 Maven 中,我们可以很方便地利用 Annotation Processing Tool(APT) 来生成代码,配置简洁明了。比如在 Maven 中配置 Vert.x Codegen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<pluginManagement>
<plugins>
<!-- Configure the execution of the compiler to execute the codegen processor -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<annotationProcessors>
<annotationProcessor>io.vertx.codegen.CodeGenProcessor</annotationProcessor>
</annotationProcessors>
<compilerArgs>
<arg>-AoutputDirectory=${project.basedir}/src/main</arg>
</compilerArgs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>

而 Gradle 就不是那么方便了,官方文档里没有讲,各种插件又不太好使,因此自己摸索了摸索。其实,我们只要搞明白APT的处理过程,一切问题就迎刃而解了。在编译阶段,我们可以通过-processor来配置对应的注解处理器,并将注解处理器的包文件加到CLASSPATH中。因此,我们可以在Gradle中写一个task来处理注解:

1
2
3
4
5
6
7
8
9
task annotationProcessing(type: JavaCompile, group: 'build') {
source = sourceSets.main.java
classpath = configurations.compile + configurations.compileOnly
destinationDir = project.file('src/main/generated')
options.compilerArgs = [
"-proc:only",
"-processor", "xxx.yyy.zzzProcessor"
]
}

其中source代表源代码目录,classpath设为所有的依赖,destinationDir代表输出路径,options.compilerArgs代表javac的配置项。注意编译期依赖可以用compileOnly表示(Gradle 2.12及以上版本支持)。

下面我们来看一个例子:如何在Gradle中使用Vert.x Codegen。首先先写处理注解的task:

1
2
3
4
5
6
7
8
9
10
task annotationProcessing(type: JavaCompile, group: 'build') {
source = sourceSets.main.java
classpath = configurations.compile + configurations.compileOnly
destinationDir = project.file('src/main/generated')
options.compilerArgs = [
"-proc:only",
"-processor", "io.vertx.codegen.CodeGenProcessor",
"-AoutputDirectory=${destinationDir.absolutePath}"
]
}

注意Vert.x Codegen要设定outputDirectory项(输出路径)方可生成代码。

下面我们在 compileJava 中引用 annotationProcessing

1
2
3
4
5
6
compileJava {
targetCompatibility = 1.8
sourceCompatibility = 1.8
dependsOn annotationProcessing
}

这样在进行构建的时候,Gradle就可以利用APT来处理注解,生成代码了。如果要引用这些生成的代码,还要把它们加到源码路径中:

1
2
3
4
5
6
7
sourceSets {
main {
java {
srcDirs += 'src/main/generated'
}
}
}

题外话:安卓开发中也需要处理一些Android SDK中特定的注解,不过Jack发布后一般都有专门的插件,不需要自己写task。

文章目录