Gradle学习-6 APT 实现一个路由跳转框架(APT、发布maven仓库)

  • Annotation 注解:注解是元数据,即描述数据的数据
  • APT(Annotation Processing Tool)注解处理器

APT工作原理
在这里插入图片描述

Demo介绍

APT项目地址
使用APT maven仓库地址

(1)项目配置

  • Gradle 8.2
  • AGP 8.2.0
  • Java jdk 17
  • Kotlin 1.9.0

(2)Demo介绍

  • 我们将自定义一个注解LeonDestination

MainActivity
在这里插入图片描述

TestActivity
在这里插入图片描述

  • 我们要实现通过 url 进行 activity 的跳转,如下通过url实现从MainActivity跳转至TestActivity
    在这里插入图片描述

1、实现注解模块

  • 在根目录下,新建一个 leon-ann 文件夹
  • 在leon-ann文件夹下新建一个build.gradle文件

build.gradle

//利用java插件、kotlin插件
apply plugin: 'java'
apply plugin: 'kotlin'//源码兼容性 java jdk 17
java {sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}
  • 在根目录下的setting.gradle中加入leon-ann模块

setting.gradle

rootProject.name = "GradleApt"
include ':app'
include ':leon-ann'
  • 在leon-ann文件夹下新建一个src/main/java/com.leon.ann目录
  • 在com.leon.ann目录下新建一个Annotation类 LeonDestination
//限定作用于类
@Target(AnnotationTarget.CLASS)
//编译期可见
@Retention(AnnotationRetention.BINARY)/*** @param url 路由* @param description 描述*/
annotation class LeonDestination(val url: String,val description: String
)

2、实现注解处理器模块

  • 在根目录下,新建一个 leon-processor文件夹
  • 在leon-ann文件夹下新建一个build.gradle文件

build.gradle

//利用java插件、kotlin插件
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'//源码兼容性 java jdk 17
java {sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}dependencies{//依赖注解子工程implementation project(':leon-ann')//注册注解处理器implementation 'com.google.auto.service:auto-service:1.0-rc6'kapt 'com.google.auto.service:auto-service:1.0-rc6'//生成kotlin类implementation 'com.squareup:kotlinpoet:1.11.0'
}
  • 在根目录下的setting.gradle中加入leon-processor模块

setting.gradle

rootProject.name = "GradleApt"
include ':app'
include ':leon-ann'
include ':leon-processor'
  • 在leon-processor文件夹下新建一个src/main/java/com.leon.processor目录
  • 在com.leon.processor目录下新建一个类 LeonProcessor
//源码兼容性 java jdk 17
@SupportedSourceVersion(SourceVersion.RELEASE_17)
//自动生成注解处理器
@AutoService(Processor::class)
class LeonProcessor : AbstractProcessor() {//TAGcompanion object {const val TAG = "LeonProcessor"}//告诉编译器,当前注解处理器支持的注解类型 - LeonDestinationoverride fun getSupportedAnnotationTypes(): MutableSet<String> {return Collections.singleton(LeonDestination::class.java.canonicalName)}/*** 编译器找到我们关心的注解后,会调用的方法** @param set 编译器搜集到的注解信息* @param roundEnvironment 编译环境*/override fun process(set: MutableSet<out TypeElement>?,roundEnvironment: RoundEnvironment?): Boolean {roundEnvironment?.let { env ->if (env.processingOver()) {//编译结束了,就直接返回return false}log("LeonProcessor 开始了")//拿到所有标记了 @LeonDestination 注解的  类的信息val allLeonDestinationElements =env.getElementsAnnotatedWith(LeonDestination::class.java)allLeonDestinationElements?.let { elements ->log("使用LeonDestination注解的类,有${elements.size}个")if (elements.size > 0) {//组装类信息val stringBuffer = StringBuffer()stringBuffer.append("val mapping = HashMap<String, String>()\n")elements.forEach { element ->val typeElement = element as TypeElement//在当前类上,获取 @LeonDestination 信息val leonDestination = typeElement.getAnnotation(LeonDestination::class.java)leonDestination?.let { destination ->//当前类的全名val realPath = typeElement.qualifiedName.toString()//当前类注解信息val url = destination.urlval description = destination.descriptionlog("realPath: $realPath")log("url: $url")log("description: $description")stringBuffer.append("mapping[\"$url\"] = \"$realPath\"\n")}}stringBuffer.append("return mapping\n")//生成类到本地文件中try {val packageName = "com.leon.apt"val className = "LeonDestinationMapping"val fileBuilder = FileSpec.builder(packageName, className)val classBuilder = TypeSpec.classBuilder(className).addType(TypeSpec.companionObjectBuilder().addFunction(FunSpec.builder("getMapping").returns(Map::class.parameterizedBy(String::class,String::class)).addStatement(stringBuffer.toString()).build()).build()).build()fileBuilder.addType(classBuilder)val kaptKotlinGeneratedDir = processingEnv.options["kapt.kotlin.generated"]fileBuilder.build().writeTo(File(kaptKotlinGeneratedDir))} catch (e: Exception) {log("生成类失败:${e.message}")}}}}log("LeonProcessor 结束了")return false}//输出日志信息private fun log(msg: String?) {msg?.let { m ->System.out.println("$TAG >>>>>> $m")}}
}
  • 在app目录下的build.gradle加入leon-ann、leon-processor依赖

在这里插入图片描述

    id "kotlin-kapt"
    implementation project(':leon-ann')kapt project(':leon-processor')
  • 在MainActivity上使用注解LeonDestination

在这里插入图片描述

  • 在命令行中执行以下命令
    注意,执行命令行时,先执行以下"gradle -v"、"java -version"命令,确保gradle是8.2,java jdk是17
//清理项目
./gradlew clean -q//构建项目
./gradlew :app:assembleDebug

执行效果
在这里插入图片描述

在app/build目录下生成了类LeonDestinationMapping
在这里插入图片描述

3、发布maven仓库

  • 在根目录下的gradle.properties中,添加以下代码
LEON_MAVEN_PATH=../leon-maven
LEON_MAVEN_GROUP_ID=com.leon.apt
LEON_MAVEN_VERSION=1.0.0
  • 在leon-ann目录下新建gradle.properties
LEON_MAVEN_ARTIFACT_ID=leon-apt-ann
  • 在leon-processor目录下新建gradle.properties
LEON_MAVEN_ARTIFACT_ID=leon-apt-processor
  • 在根目录下新建 leon-maven-publish.gradle
//引用 maven 插件,用于发布
apply plugin: 'maven-publish'//读取 rootProject 中的配置属性
Properties rootProjectProperties = new Properties()
rootProjectProperties.load(project.rootProject.file('gradle.properties').newDataInputStream())
def LEON_MAVEN_PATH = rootProjectProperties.getProperty("LEON_MAVEN_PATH")
def LEON_MAVEN_GROUP_ID = rootProjectProperties.getProperty("LEON_MAVEN_GROUP_ID")
def LEON_MAVEN_VERSION = rootProjectProperties.getProperty("LEON_MAVEN_VERSION")//读取子工程中的配置属性
Properties projectProperties = new Properties()
projectProperties.load(project.file("gradle.properties").newDataInputStream())
def LEON_MAVEN_ARTIFACT_ID = projectProperties.getProperty("LEON_MAVEN_ARTIFACT_ID")//输出日志
log("LEON_MAVEN_PATH: $LEON_MAVEN_PATH")
log("LEON_MAVEN_GROUP_ID: $LEON_MAVEN_GROUP_ID")
log("LEON_MAVEN_VERSION: $LEON_MAVEN_VERSION")
log("LEON_MAVEN_ARTIFACT_ID: $LEON_MAVEN_ARTIFACT_ID")//发布信息填写
publishing {publications {mavenJava(MavenPublication) {//设置groupId,通常为当前插件的包名groupId = LEON_MAVEN_GROUP_ID//设置artifactId,作为当前插件名称artifactId = LEON_MAVEN_ARTIFACT_ID//设置插件版本号version = LEON_MAVEN_VERSIONlog("pom信息groupId: $groupId")log("pom信息artifactId: $artifactId")log("pom信息version: $version")// 指定要发布的组件,例如Java库或插件等from components.java}}repositories {maven {//设置发布路径为  工程根目录下的  leon-publish 文件夹url = uri(LEON_MAVEN_PATH)}}
}//日志输出
def log(String msg) {println("maven发布 >>>>>> $msg")
}
  • 在leon-ann目录下的build.gradle引用 leon-maven-publish.gradle
apply from: rootProject.file("leon-maven-publish.gradle")
  • 执行命令
./gradlew clean -q
./gradlew :leon-ann:publish

执行结果
在这里插入图片描述
根目录下生成maven库
在这里插入图片描述

  • 在leon-processor目录下的build.gradle引用 leon-maven-publish.gradle
apply from: rootProject.file("leon-maven-publish.gradle")
  • 执行命令
./gradlew clean -q
./gradlew :leon-ann:publish

执行结果

在这里插入图片描述

根目录下生成maven库

在这里插入图片描述

4、在其他项目中引用maven仓库

  • 新建一个新的项目Application1
  • 在Application1的根目录下setting.gradle中引入leon-maven仓库

在这里插入图片描述

//引入leon-maven
maven {url uri("/Users/leon/AndroidStudioProjects/GradleLearn/apt/leon-maven")
}
  • 在app目录下build.gradle中引入leon-ann和leon-processor

在这里插入图片描述

    //groupId : artifactId : versionimplementation 'com.leon.apt:leon-apt-ann:1.0.0'kapt 'com.leon.apt:leon-apt-processor:1.0.0'
  • 在MainActivity和TestActivity中使用LeonDestination注解

在这里插入图片描述

在这里插入图片描述

  • 执行命令行
./gradlew clean -q
./gradlew :app:assembleDebug -q

执行效果
在这里插入图片描述

app/build目录下生成了类LeonDestinationMapping
在这里插入图片描述

  • 在MainActivity中实现跳转代码
import com.leon.ann.LeonDestination
import com.leon.apt.LeonDestinationMapping@LeonDestination(url = "leon://page-main",description = "这是主页"
)
class MainActivity : AppCompatActivity() {private var mBtn: TextView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)mBtn = findViewById<TextView?>(R.id.id_btn_skip).apply {setOnClickListener {//点击事件LeonDestinationMapping.getMapping()["leon://page-test"]?.let { des ->//跳转startActivity(Intent().apply {setClassName(packageName,des)})}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调整网络安全策略以适应不断升级的威胁形势

关键网络安全统计数据和趋势 当今数字时代网络安全的重要性

Python爬虫速成之路(2):爬天气情况

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

nginx的四层负载均衡实战

目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询&#xff0…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub&#xff0c;你需要按照以下步骤操作&#xff1a; 登录 Docker Hub 首先&#xff0c;你需要登录到 Docker Hub。打开终端并运行以下命令&#xff1a;docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…

MySQL复合查询(重点)

前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J mysql> select * from emp where (sal>500 or jobMANAGER) and ename l…

【数据结构初阶】详解 环形链表:链表的带环问题(判断是否带环、环形链表的入口点)

文章目录 一、链表的带环问题1.1、判断链表是否带环&#xff08;力扣 141.环形链表&#xff09;1.2 、证明&#xff1a;为什么带环时快慢指针一定相遇&#xff1f;1.3、证明&#xff1a;当slow走1步&#xff0c;fast可走3/4/5步&#xff08;fast的速度是slow的3/4/5倍&#xff…

Open3d入门 一文读懂三维点云

三维点云技术的发展始于20世纪60年代&#xff0c;随着激光雷达和三维扫描技术的进步&#xff0c;在建筑、考古、地理信息系统和制造等领域得到了广泛应用。20世纪90年代&#xff0c;随着计算机处理能力的提升&#xff0c;点云数据的采集和处理变得更加高效&#xff0c;推动了自…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

【调试笔记-20240713-Windows-Tauri 多个HTML页面支持】

调试笔记-系列文章目录 调试笔记-20240713-Windows-Tauri 多个HTML页面支持 文章目录 调试笔记-系列文章目录调试笔记-20240713-Windows-Tauri 多个HTML页面支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似问题 三、应用场…

FPGA入门-自用

写代码&#xff0c;并将引脚对应到板子相应的引脚上 下载程序到板子上 遇到错误了&#xff0c;不按想的来的了&#xff0c;进行仿真 查看网表图查看问题所在 简化了一些步骤&#xff1a;未使用引脚的设置&#xff0c;电压设置&#xff1b; 通过画网表结构图来构成电路 时钟 …

SpringBoot+Vue实现简单的文件上传(txt篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传txt文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el-…

Windows安装linux子系统

Windows安装linux子系统 步骤 1 - 启用适用于 Linux 的 Windows 子系统 需要先启用“适用于 Linux 的 Windows 子系统”可选功能&#xff0c;然后才能在 Windows 上安装 Linux 分发。 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 …

Ubuntu 安装搜狗输入法

搜狗输入法已支持Ubuntu1604、1804、1910、2004、2010 各系统安装步骤可能略有不同 1、添加中文语言支持 打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言” 弹出“已安装语言”窗口&#xff0c;勾选中文&#xff08;简体&…

[笔试训练](二十七)109:旋转字符串110:合并k个已排序的链表111:滑雪

目录 109:旋转字符串 110:合并k个已排序的链表 111:滑雪 109:旋转字符串 题目链接:旋转字符串_牛客题霸_牛客网 (nowcoder.com) 题目: 题解: class Solution { public:bool solve(string A, string B) {int nA.size();if(n!B.size()) return false;for(int i0;i<n;i){…

java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言 来不及悼念字符串了&#xff0c;接下来登场的是集合&#xff0c;集合和数组的用法差不多&#xff0c;不同之处就在于存储的内容&#xff0c;数组是固定的长度的&#xff0c;集合的长度不固定。学习的过程中可以参照数组 今天已经是学习java的第八天了&#xff0c;接下…

LabVIEW中modbusTCP怎样才能和profibusDP通信?

在LabVIEW中&#xff0c;Modbus TCP和Profibus DP是两种不同的工业通信协议&#xff0c;要实现这两者之间的通信&#xff0c;可以采用网关设备进行协议转换&#xff0c;或者通过一个中间设备&#xff08;如PLC&#xff09;进行数据桥接。以下是实现此通信的一些方法&#xff1a…

win10系统更新后无法休眠待机或者唤醒,解决方法如下

是否使用鼠标唤醒 是否使用鼠标唤醒 是否使用键盘唤醒

unity 手动制作天空盒及使用

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、使用前后左右上下六张图1.准备6张机密结合的图片2.创建Material材质球3.使用天空盒 二、使用HDR贴图制作1.准备HDR贴图2.导入unity 修改Texture Sourpe 属性3.创建材质球4.使用…

【java计算机毕设】基于J2EE的仓库管理系统设计与开发源码带文档MySQL ssm vue maven前后端可分离也可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 2项目介绍 系统功能&#xff1a; 仓库管理系统包括管理员、员工俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、仓库信息管理、基础数据管理功能模块有仓库类型管理和物资类型管理、物资信息管理…

CSS学习碎碎念之卡片展示

效果展示&#xff1a; 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片展示</title…