AutoService注解无法生成META-INF文件

背景

在写注解处理器时,首先就是要继承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文件夹生成了:

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的autoservice注解是一种用于服务发现的机制,它能够自动将服务的实现类注册到指定的配置文件中,一般是META-INF/services目录下的文件。 然而,的确有一些情况下autoservice注解无法生成META-INF文件。这可能是由于以下几种原因导致的: 1. 编译问题:可能是由于编译配置的问题,导致编译器无法正确处理autoservice注解。这种情况下,我们可以尝试检查编译器的配置,或者使用其他IDE或编译工具进行尝试。 2. 库或框架限制:有些库或框架可能不支持autoservice注解,或者在使用autoservice注解时会有特殊的要求。我们可以查看相关库或框架的文档,了解其对autoservice注解的支持情况,或者尝试其他方式实现服务发现。 3. 配置文件缺失或错误:autoservice注解生成META-INF文件的前提是META-INF目录存在,并且配置文件的名称和路径正确。如果自动生成META-INF文件不存在,或者文件名或路径有误,就无法实现服务发现。我们需要检查项目的文件结构,确认META-INF目录是否存在,并且配置文件的名称和路径是否正确。 总之,虽然autoservice注解通常可以自动将服务实现类注册到META-INF文件中,但在某些情况下可能会遇到无法生成META-INF文件的问题。我们需要仔细检查编译配置、库或框架限制,以及配置文件是否正确等因素,以找出问题所在,并采取相应的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值