背景:
最近团队在进行中台化建设,其中插件化方案使用的pf4j(后续会专门出文章介绍),开发完一个插件,打包发布的时候,META-INF下总是会生成一个文件 extensions.idx,此文件非常重要。但是我查看插件开发,过程中的配置以及业务代码,并没有什么地方可以指定此文件。
排查过程:
请教了团队中的资深开发,他之前可能没有注意到这个细节,一时半会也答不上来。此插件化技术方案,是我们团队第一次引用,我担心此框架了解不足,后续出现问题,没有人能cover住,于是拉下源码,自己看下。
拉代码以及排查过程,不再表述。咱们直接看核心代码。首先排查到了LegacyExtensionStorage
最终排查到入口ExtensionAnnotationProcessor,如下所示:
分析过程:
要想弄清楚此问题,需要引入本次主角 JAT-- Annotation Processor Tool。
1.什么是APT?
APT即为Annotation Processing Tool,它是javac的一个工具。APT可以在编译时(javac默认行为)扫描和处理注解。通过APT可以获取到注解和被注解对象的相关信息,我们可以根据这些信息,灵活的做一些事情。获取注解及生成代码都是在代码编译时候完成的, APT并不能对源文件进行修改操作,只能生成新的文件,例如在已有的类中添加方法。APT的核心是AbstractProcessor类。
2.哪里用到了APT?
APT技术被广泛的运用在Java框架中,包括Android项以及Java后台项目,知名的项目很多都有用到,比如lombok,当然还是我们正在使用的pf4j。
平时自己的项目中,也可以使用JAT,比如有的同学,利用JAT,检查项目中的事务,是不是注解有问题,例如打在了private方法上。有的同学,利用自己定义的注解,在编译的时候,生成一些样板代码等等。
3.如果使用JAT?
1)实现自己的processor继承javax.annotation.processing.AbstractProcessor。
2)项目的resources目录下,创建文件夹META-INF.services,然后创建一个文件
javax.annotation.processing.Processor
3)第二步创建的文件中,一行一个录入处理类的全限定命即可。
总结:
APT技术存在已经很长时间了,很遗憾工作好些年了,今天才知道,下面这张图是网上的一张截图,能简单的说明问题,贴出来大家一起学习下。