大家都知道java的注解(Annotation) 包含了运行时注解和编译时注解。
运行时注解的例子:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface InjectView { int id() default 0; }
编译时注解的例子:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.CLASS) public @interface InjectView { int id() default 0; }
他们之间的区别是RetentionPolicy不同。
在开发编译时注解,我们通常会写一个compiler的java module。以我自己的框架为例,有一个saf-injectview-compiler
今天要说的填坑是:这个compiler module在打成jar包,给其他项目使用需要注意的事项。
下面是我的打包脚本
task buildInjectCompiler( type: Jar) { archiveName = 'SAF-inject-compiler-'+VERSION_NAME+'.jar' //初始化资源路径集 from baseCompilerPath, injectviewCompilerPath //去除路径集下部分的资源 exclude "**/BuildConfig.class" exclude "**/Manifest.class" exclude "**/R.class" exclude "**/R\$*.class" //只导入资源路径集下的部分资源 include "cn/salesuite/**/*.class" include "META-INF/services/javax.annotation.processing.Processor" destinationDir = file('build/outputs/') }
最为重要的是这一句:
include "META-INF/services/javax.annotation.processing.Processor"
是必须要添加的,虽然我们可能使用 Google 的 auto-service 库可以自动生成 META-INF/services/javax.annotation.processing.Processor 文件,但是打包时一定要将这个文件打入jar包,否则无法使用我们的自定义注解。
最后,我们看一下完成之后compiler包的情况,我们已经把javax.annotation.processing.Processor文件打入jar包了。