在 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> <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。