Android:发布aar包到maven仓库以及 maven插件 和 maven-publish 插件的区别
前言
在日常开发中,不可避免的需要把自己的 library 发布到 maven 仓库中,这样使用起来也更加方便。
发布 aar 包到 maven 仓库,主要是使用 Gradle 提供的插件:
- maven 插件(旧版),在 Gradle 6.2 之后,就完全被弃用了(增加了 @Deprecated 注解)
- maven-publish 插件
maven插件,是 Gradle 1.0 的时候提供的用于发布aar/jar包到 Maven 仓库的插件。在 Gradle 1.3 中,引入了一种新的发布插件,即:maven-publish ,这个新的插件引入了一些新概念和新功能,使 Gradle 发布功能更加强大,现在是发布工件的首选选项。
一、基本概念
1、什么是POM?
POM(Project Object Model)指项目对象模型,用于描述项目构件的基本信息。一个有效的 POM 节点中主要包含一下信息:
配置 | 描述 | 举例('com.github.bumptech.glide:glide:4.11.0') |
---|
2、 什么是仓库(repository)?
在项目中,我们会需要依赖各种各样的二方库或三方库,这些依赖一定会存放在某个位置(Place),这个 “位置” 就叫做仓库。使用仓库可以帮助我们管理项目构件,例如 jar、aar 等等。
主流的构建工具都有三个层次的仓库概念:
- 1、本地仓库: 无论使用 Linux 还是 Window,计算机中会有一个目录用来存放从中央仓库或远程仓库下载的依赖文件;
- 2、中央仓库: 开源社区提供的仓库,是绝大多数开源库的存放位置。比如 Maven 社区的中央仓库 Maven Central ;
- 3、私有仓库: 公司或组织的自定义仓库,可以理解为二方库的存放位置。
构建时搜索依赖的顺序如下:
- 1、在本地仓库搜索,如果搜索不到,执行步骤 2;
-
2、在中央仓库和私有仓库中搜索,搜索顺序按照
repositories
中声明的顺序依次查找。如果找到,则下载依赖文件到本地仓库,否则执行步骤 3; - 3、如果最终找不到依赖项,则抛出错误 “无法找到依赖项”。
了解这些基本概念之后,下面就介绍一下,通过 Gradle 提供的 maven 插件 和 maven-publish 插件,如何发布aar/jar包。
二、maven 插件
maven 插件是 Gradle 1.0的时候提供的,使用 maven 插件,遵循如下步骤:
1、使用 maven 插件
在 需要发布aar包的 library 模块的 build.gradle 文件中,应用 maven 插件:
apply plugin: "maven"
2、配置POM
在 build.gradle 文件中,增加如下的 配置信息:
def localDefaultRepo = "file://" + new File(System.getProperty("user.home"), '.m2/repository').absolutePath uploadArchives { repositories.mavenDeployer { // repository(url: uri('~/.m2/repository')) // 注释1 // 配置仓库地址 repository(url: uri(localDefaultRepo)) // repository(url: uri('../repo')) // 配置 pom 信息 pom.groupId "com.mei.http" pom.artifactId "myhttp" pom.version "1.0.0-SNAPSHOT" pom.packaging "aar" // pom.project { // groupId "com.mei.http" // artifactId "myhttp" // version "1.0.1-SNAPSHOT" // packaging "aar" // } } }
如上所示,指定 仓库的地址,配置 pom 信息。这样配置完成之后,在task 任务列表中,就可以看到
upload/uploadArchives
任务。
这里配置的仓库地址是一个本地路径,即把 aar 发布到本地的一个文件夹中。这里的
USER_HOME/.m2/repository/
目录,是Gradle 默认的本地仓库地址,其中
USER_HOME
是用户目录。
2-1、默认本地仓库
在指定 本地仓库地址的时候,踩了一个坑,如果想使用 本地默认仓库地址,如:
repository(url: uri('/.m2/repository')) println "path=${uri('~/.m2/repository')}"
打印出的路径:
path=file:/Users/mei/WorkSpace/AndroidDemo/MAarPublish/myhttpjava/~/.m2/repository/
执行 uploadArchives 任务之后,在
USER_HOME/.m2/repository/
目录 中,是没有 aar 文件的,如:
所以这个时候,去使用的话,是加载不到 aar 文件的。
这是什么原因导致的呢,其实就是路径问题。
当用绝对路径的时候,即:
def localDefaultRepo = "file://" + new File(System.getProperty("user.home"), '.m2/repository').absolutePath
当仓库地址 用 localDefaultRepo 的时候,在 USER_HOME/.m2/repository/ 目录就可以看到发布之后的 aar 包了,如:
这样 aar 包就发布成功了。
使用
在 工程的 build.gradle 文件中,引入默认的本地仓库,如:
allprojects { repositories { ..... mavenLocal() // 使用默认的本地仓库 } }
在 app 的 build.gradle 文件中,引用 myhttp 库: