首页 > 编程语言 >java-动态模块添加注解处理器

java-动态模块添加注解处理器

时间:2023-04-21 20:48:04浏览次数:36  
标签:java implementation jar 处理器 模块 注解 annotationProcessor sdk

前言:

最近接了个任务要在app中接入QQ小游戏sdk。因为该小游戏只是在国内不在googleplay发行,则需要做成动态模块的方式。

步骤

一、在工程中创建动态模块

二、接入QQ小游戏sdk

1、该sdk暂时不支持外部maven,则需要把对应的sdk拷贝到自己的目录下。

2、将对应sdk的aar和jar拷贝到libs目录下

3、因为要求必须要实现MiniAppProxy,并且要实现的Proxy必须添加注解

4、添加完之后验证是否添加sdk并且实现MiniAppProxy成功,编译之后发现找不到ExtProxyServiceScope对应的类

三、问题排查

1、排查是不是动态模块比较特殊:将对应的sdk和实现添加的注解放到主app或者添加到静态模块,发现都能够生成ExtProxyServiceScope。

2、怀疑是不是动态模块是不是哪里的配置不对,排查了很久发现自己本身的gradle配置没啥问题

3、再重新看QQ小游戏的demo,发现他是通过如下的方式

        // 本地maven,外网maven申请中,也可以把repository目录下的aar拷贝到自己的项目
        maven {url '../repository'}


    def miniSdkVersion = '1.6.41'
    annotationProcessor "com.tencent.qqmini:miniannotation_processor:${miniSdkVersion}"
    implementation "com.tencent.qqmini:miniannotation:${miniSdkVersion}"
    implementation "com.tencent.qqmini:minigame:${miniSdkVersion}"

通过将对应的sdk放到本地的repository目录下然后再进行处理注解和导入

这样子也通过他这种方式进行操作发现竟然可以了;

 

事情到这里就开始研究为啥这种方式这种方式和放到lib的方式的区别

四、原因发现

1、maven中,会放对应的jar或者aar还有pom文件。重点在这个pom文件,该文件会描述本jar包的名字还有对应的依赖项。

通过这个去查看注解的jar对应的依赖项:

发现除了miniannotation的jar文件,还有依赖另外的一个文件javapoet;该文件的功能才是生成注解文件必要的文件

那么小游戏sdk的jar和aar放到libs的方式应该是可行的,只要再导入javapoet就可以了。

即:

implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

implementation "com.squareup:javapoet:1.11.1"

编译发现还是不对~~~~

不能只是implementation么?

通过对比demo发现,注解处理器导入的方式有点区别:annotationProcessor "xxxxxxx" 这种方式,而不是implementation的方式

那么修改成

    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

    annotationProcessor files('libs/miniannotation_processor-1.6.41.jar')
    implementation "com.squareup:javapoet:1.11.1"

 

发现可以了,然后通过另外的关键字kapt测试是否可以,发现也是没有问题。通过上网发现注解处理器的导入还可以通过kapt 而不止有annotationProcessor

那么kapt和annotationProcessor到底有啥区别呢?这里问了下chatgpt,他给了对应的解释

`kapt`(Kotlin Annotation Processing Tool)和 `annotationProcessor` 都是用于处理注解的 Gradle 依赖项配置。它们在处理注解方面具有相似的功能,但主要的区别在于它们所支持的编程语言。
1. `annotationProcessor`:这个配置是 Android 项目中 Java 模块使用的默认注解处理器配置。它只能处理 Java 代码中的注解。当你在 Java 编写的 Android 项目中使用注解处理器时,可以通过此项配置添加相应的依赖。
2. `kapt`:这个配置专门针对 Kotlin 项目设计。由于 Kotlin 和 Java 存在差异,因此单独使用 `annotationProcessor` 无法正确处理 Kotlin 代码中的注解。因此,Kotlin 项目需要使用 `kapt` 来代替 `annotationProcessor` 进行注解处理。
如果你的 Android 项目使用 Kotlin 编写,你应该将注解处理器依赖添加到 `kapt` 而不是 `annotationProcessor`。

 

通过上述的说明,如果支持kotlin则可以使用kapt

 

五、总结

1、注解处理器不管是在静态模块还是动态模块都是能够生成的

2、放弃maven,使用本地libs导入的方式需要注意该jar文件对应的pom文件是否有描述依赖的文件,如果有则需要保证所有的文件已经导入

3、在发现demo可以但是本地不行的时候,要先对比demo跟本地的差异是什么而不是先去验证在app是否可以为啥可以而本动态模块不一样

 

标签:java,implementation,jar,处理器,模块,注解,annotationProcessor,sdk
From: https://www.cnblogs.com/czwlinux/p/17341728.html

相关文章

  • EasyExcel格式化映射注解和样式注解详解
     https://blog.csdn.net/qq_44749491/article/details/127879946一、概述使用注解很简单,只要在对应的实体类上面加上注解即可。也就是说使用实体类模型来读写Excel文件时,可以通过注解来控制实体类字段和Excel列之间的对应关系。二、ExcelProperty2.1作用ExcelProperty注解用......
  • 异常:Caused by: java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.CellStyl
    1、EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目a.POI非常耗内存(大的excel需要上G的内存)系统容易出现OOMb.POI代码也相当复杂,后面在进行维护的时候也不大好操作2、在往Excel写入数据时出现如下错误com.alibaba.excel.exception.ExcelGenerat......
  • 2.自定义@Excel注解实现数据Excel形式导入导出
    https://zzpc.net/content/206150.html前言这几天在学习如何使用自定义注解实现Excel格式数据导入导出,参考的还是若依框架里面的代码,由于是初学,所以照猫画虎呗,但是难受的是需要复制并根据自己项目修改作者自定义的工具类以及导入这些工具类的依赖包。由于吃了这个苦,我决定把......
  • java 迭代器使用
    https://www.cnblogs.com/SjhCode/p/Iterator.html java迭代器使用 原文链接:https://blog.csdn.net/ACE_kk/article/details/126182500一、前言在迭代器(Iterator)没有出现之前,如果要遍历数组和集合,需要使用方法。数组遍历,代码如下:String[]arr=newString[]{"Java......
  • Java WebSocket客户端
    https://www.cnblogs.com/SjhCode/p/WebSocketClient.html注意事项:1.@Scheduled(fixedDelay=5000)2.心跳检测3.导入依赖与导包<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.......
  • java中有关于时间格式以及定时器遇到的问题
    https://www.cnblogs.com/SjhCode/p/time.html时间格式这个是通过Calendar做时间滚动 //开始时间yyyy-MM-ddHH:mm:ss@Value("${StartTime}")@JsonFormat(timezone="GMT+8",pattern="yyyy-MM-ddHH:mm:ss")@DateTimeFormat(pattern="yyyy-MM-......
  • Java-Day-13(抽象类 + 接口 + 内部类)
    Java-Day-13抽象类(abstract)当父类的某些方法需要声明,但是又不确定如何实现时(主要在于子类的重写时),可以将其声明为抽象方法,那么这个类就是抽象类所谓抽象方法就是没有实现的方法,而所谓没有实现就是指没有方法体当一个类中存在抽象方法时,需要将该类声明为abstract......
  • Java学习笔记(三)
    1.  请描述你理解的循环按照一定次数重复地执行程序,直至达到次数上限,将重复的代码只编写一次,然后再重复执行即可,这样的程序结构就是循环结构。2.  请描述嵌套for循环执行的过程嵌套循环是先执行外层循环,然后再执行内层循环。外层循环执行一次,内层执行若干次,当内层执行完......
  • 老杜 JavaWeb 讲解(四) ——Servlet编写JDBC连接数据库
    老杜 JavaWeb 讲解对应视频:08-servlet中编写jdbc程序连接数据库(六)在Servlet(Java小程序)中编写JDBC连接数据库6.1JDBC介绍:JDBC的全称是Java数据库连接(JavaDatabaseconnect),它是一套用于执行SQL语句的JavaAPI。[1]JDBC(JavaDataBaseConnectivity)是Java编程语言中......
  • mac M2 设置JAVA_HOME不生效
    1.打开终端2.如果不存在可以使用touch.bash_profile创建一个新文件3.复制一下内容,惟一要更改的是版本号open-e.bash_profileJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/HomePATH=$JAVA_HOME/bin:$PATH:.CLASSPATH=$JAVA_HOME/lib/tool......