Android-Nexus 搭建自己的 Maven 仓库 & Gradle 上传依赖包

####Maven 的介绍

从 Maven 的依赖下载管理角度来看,Maven 仓库的可分为两类,远程仓库和本地仓库。

本地仓库是电脑硬盘上的一个目录,远程仓库是在指放在远程服务器上电脑硬盘上的 Maven 仓库目录,使用需添加远程仓库的地址,才能正常连接下载依赖。

Maven 的远程仓库分为中央仓库和私服仓库。中央仓库存放了世界各地用户上传的依赖包,比较出名的是 JCenter 和 Maven Central,开源的第三方依赖一般都会上传到这两个中央仓库,这样我们只用添加这两个中央仓库的链接地址,就可以下载各种我们需要的依赖了。

由于每次构建都需要从中央仓库下载依赖,对于中央仓库的服务器来说,压力很大,间接导致下载速度很慢。并且,上传到中央仓库的依赖都是开源的,只要知道名字,用户就都能下载,虽然开源精神是值得倡导的,但是一些公司内部的核心依赖包,出于一些考虑,无法直接开源。于是,私服仓库就诞生了。在公司的局域网,搭建一个 Nexus 仓库,把公司内部不想开源的依赖包上传到私服仓库中,这样下载依赖的需满足两个条件,私服仓库的地址和在公司局域网内,一定程度上有个保密和安全性。

私服是一种特殊的远程仓库

私服是一种特殊的远程仓库, 它设在局域网内, 通过代理广域网上的远程仓库, 供局域网内的 Maven 用户使用。私服的存在,特殊于,它改变了 Maven 下载依赖的机制。

只有本地仓库和远程中央仓库时,当 Maven 根据坐标寻找依赖包时, 首先会检索本地仓库, 如果本地存在则直接使用, 否则去远程仓库下载.

但是,当有了一个私服后:

当检索本地仓库发现不存在的时候, Maven 客户端先向私服请求, 如果私服不存在该依赖包, 则从外部的远程仓库下载, 并缓存在私服上, 再为客户提供下载服务。简单的理解是私服相当于本地仓库和远程中央仓库的中间缓存,因此,私服的存在,可以节省公网带宽,利用内网下载依赖项速度快。

下面是一张本地仓库,私服仓库和远程中央仓库的依赖下载示意图(构件可理解为三方的依赖包,是比较专业的说法):

####Nexus 搭建私服

官网:https://www.sonatype.com/download-oss-sonatype

下载 nexus-3.13.0-01 版本

安装帮助文档如下,过程比较简单,按照执行即可

java 环境需要1.8

https://help.sonatype.com/repomanager3/installation

安装成功之后,启动nexus 服务器可以通过http://ip:8081/的访问
如果不能访问,关闭防火墙再试。

Androidstudio 工程AAR上传

Android中上传AAR是通过gradle中增加人物的方式实现上传的,首先在依赖module的build.gradle中增加

pom中GROUP,POM_ARTIFACT_ID 在module目录下的gradle.propertis文件中配置

HAIXUE_LIB_VERSION_NAME, NEXUS_USERNAME, NEXUS_PASSWORD,在项目目录的config/dependencies 目录下面配置

所有子module都配好,点击右侧的gradle任务栏中的upload/uploadArchives 任务执行上传任务,点击项目根目录的upload/uploadArchives 则会遍历所有子module 上传编译后的aar ,上传成功后,到nexus的服务器上查看

AAR已经上传成功,注意同一个版本的库文件,只能上传一次,第二次则会出错,也避免库文件被异常覆盖

AAR 文件引用

在项目的根目录的build.gradle 文件中配置

1
2
3
4
5
6
7
8
9
10
11
12

maven {
url "http://192.168.16.219:8081/repository/maven-public"
credentials {
username = "admin"
password = "admin123"
}
}


// module 中引用AAR
implementation "com.lzy.imagepicker:imagepicker:${haixueLibVersion}"

haixueLibVersion是定义的统一版本,因为模块之间存在的依赖关系,比如:依赖关系A->B->C
那么A,B,C 三个模块生成AAR之后,如果其中的A发生了变更升级版本,那么同时B,C 也需要同时跟着升级。

我们的使用规则?

目前我们

清除gradle缓存

//Windows用这个
gradlew build –refresh-dependencies
//Mac用这个
./gradlew build –refresh-dependencies