背景
最近项目组有一个需求是这样的:
同一份代码,被不同的工程引用,里面的POJO都是对应 MongoDB
数据库里的集合对象
不同的工程使用的技术栈不太一样,对于 _id
的注解是不一样的
我们希望引入源码期间的注解来解决这个问题
本文章探讨的内容
注解、注解处理器都好写,我发现比较困难的是 如何执行注解处理器
(如何写注解处理器,网上很多博客了,不在此博客探讨范围内)
网上搜了一堆博客、文章,发现都是抄来抄去的,实践下来,一堆报错
研究了好久,终于把 Maven
Gradle
里的配置弄清楚了,分享出来
Demo 代码
demo 代码我上传到了 github
大家可以自行查看
工程介绍
name | descrption |
---|---|
yellow-proceesor |
包含注解 和注解处理器 的工程,以jar 包形式对外提供服务 |
yellow-doc |
使用了注解,并且希望在编译的时候,执行注解处理器进行一些操作的工程 |
yellow-proceesor
这个工程包含了 注解
注解处理器
当然了,这两个东西也可以在不同的工程里面,大家可以根据实际需要,灵活配置
注解
是 com.yellow.anno.MyId
注解处理器
是 com.yellow.anno.process.IdProcessor
(这个demo里有好几个注解处理器,是为了测试 javax.annotation.processing.Processor 这个文件的)
这个工程是 Maven
的,需要先行 install
到本地仓库
yellow-doc
这个工程里面包含了两份打包脚本 Maven
Gradle
大家可以根据项目需要,看不同的配置 pom.xml
build.gradle
神奇的 javax.annotation.processing.Processor
网上看到大部分博客说需要这个 文件,小部分博客说不需要
有的博客说不需要这个文件,只是需要AutoService
注解
经过我的实验,对于纯Java
非Android
工程, 这个文件是不需要的(Android我不懂,没有测过)
我们项目组的工程是Spring Boot
类型
配置介绍
Maven
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<annotationProcessorPaths>
<path>
<groupId>com.yellow</groupId>
<artifactId>skmr-proceesor</artifactId>
<version>1.6</version>
</path>
<!-- ... more ... -->
</annotationProcessorPaths>
<annotationProcessors>
com.yellow.anno.process.BIdProcessor
</annotationProcessors>
</configuration>
</plugin>
这个用法在官网有介绍
path
里是注解处理器所在的jar
包
annotationProcessors
是注解处理器
全包名
列表
需要注意的是,demo的pom.xml
的 dependencies
也依赖了这个包
这个是因为注解
也在这个包里,才需要依赖的,否则的话是不用的
Gradle
build.gradle
dependencies {
//注解所在的包
compile group: 'com.yellow', name: 'skmr-proceesor', version:'1.6'
//注解处理器所在的包
annotationProcessor 'com.yellow:skmr-proceesor:1.6'
}
compileJava.options.compilerArgs << "-processor" << "com.yellow.anno.process.BIdProcessor"
这个答案是在 这里 看到的
亲测有效
和Maven
同理, compile
依赖这个包只是因为 注解在这个包里,否则 annotationProcessor
配置一下即可
更新于 2019年3月12日 09:54:30
在Gradle
里可以配置多个不同的注解处理器供使用
//选择生成C端使用的包
task selectCAnnotationProcessor << {
println "select processor for C"
compileJava.options.compilerArgs << "-processor" << "com.fanggeek.anno.process.CIdProcessor"
}
//选择生成B端使用的包
task selectBAnnotationProcessor << {
println "select processor for B"
compileJava.options.compilerArgs << "-processor" << "com.fanggeek.anno.process.BIdProcessor"
}
网友评论