在写注解处理器时,首先就是要继承AbstractProcessor,并且按照如下步骤声明:
-
需要在 processors 库的 main 目录下新建 resources 资源文件夹;
-
在 resources文件夹下建立 META-INF/services 目录文件夹;
-
在 META-INF/services 目录文件夹下创建 javax.annotation.processing.Processor 文件;
-
在 javax.annotation.processing.Processor 文件写入注解处理器的全称,包括包路径;
这样声明下来也太麻烦了?这就是用引入auto-service的原因。
在类的顶部加入注解:@AutoService(Processor.class),这个注解处理器是Google开发的,可以用来生成 META-INF/services/javax.annotation.processing.Processor 文件信息。
使用遇到的问题在module_processor中导入我们要用的auto-service库;
implementation 'com.google.auto.service:auto-service:1.0-rc6'
在类上面添加service的注解即可:
@AutoService(Processor.class)
public class BindViewProcessor extends AbstractProcessor {
...}
编译项目后却始终不见META-INF目录的生成,正常是会在该注解处理器项目的目录module_processor/build/classes/java/main/META-INF下生成。
解决方案一:网上有人说是gradle的版本问题
(1)将原来根目录的build.gradle 里依赖的gradle版本改为3.5.3
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
(2)以及gradle-wrapper.properties文件的gradle版本修改为4.X版本的较低版本
方案一我没有试过,不知是否可行,而且要改gradle的版本可能对原本的项目会有影响。
方案二:继续使用gradle5.4.1版本:由于Gradle 5.0将忽略compile classpath中的 annotationProcessor,因此需要手动添加annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'到 annotation processor path 如下:
implementation 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
完整gradle脚本:
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc6'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
implementation 'com.squareup:javapoet:1.10.0'
implementation project(':module_annotation')
}
sourceCompatibility = "7"
targetCompatibility = "7"
完成后,再重新编译下,就可以看到META-INF文件夹生成了: