使用 Docker 搭建 Maven 私服,并通过 maven-publish 上传 aar 到 Maven 私服

1 Maven 与 Maven 私服

对于 Maven 大家应该都还不算太陌生,虽然作为 Android 开发我们都是用 gradle 来进行项目构建、依赖管理等工作,但是我们还是离不开 Maven 的中心仓库 Maven Central ,例如在我们的根 build.gradle 文件中就可以看到这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.2'
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}

这其中的 mavenCentral() 就是指将 Maven Central 指定为项目的Maven仓库,我们依赖某些第三方库时,会从 Maven Central 尝试搜索。

由于网络问题,我们直接访问 MavenCentral 往往比较慢,也会经常出现无法下载第三方库的情况。这种情况我们可以通过国内的 Maven Central 镜像仓库来解决这种问题,比如阿里云云效的Maven镜像,使用起来也很简单:

1
2
3
4
//central 与 jcenter的聚合仓库
maven{ url 'https://maven.aliyun.com/repository/public'}
//google 仓库
maven{ url 'https://maven.aliyun.com/repository/google'}

只需要将上面的代码添加到 allprojects 下的 repositories 即可。

1.1 为什么我们需要私服

既然有了中心仓库还有中心仓库的镜像站,为什么我们还需要私服?因为我们有的工件会存在一些私有业务之类,并不适合部署在 MavenCentral 这样的公开仓库,这种情况我们可以选择使用阿里云云效提供的免费Maven私有服务

另一个选择就是搭建内网环境的 Maven 私服,还可以通过 Maven 私服作为代理,代理其他的 Maven 仓库。盗一张图方便大家理解:

Maven私服

这样通过 Maven 私服可以对用到的各个 Maven 仓库的工件进行缓存,其他成员用户使用时可以提升拉取速度。

1.2 使用 Docker 搭建 Maven 私服

过程超级简单,步骤如下:

  1. 下载安装 Docker
  2. 拉取 Nexus3 镜像
    docker pull sonatype/nexus3
  3. 运行镜像 docker run -d -p 8081:8081 --name nexus sonatype/nexus3
  4. 打开网站 http://localhost:8081/
  5. 查找密码登录 admin
  6. 创新自己的账号

旧版的Nexus密码是 admin123,新版的需要自己去docker中查看:

  1. 查看正在运行的容器:docker ps
  2. 进入容器 :docker exec -it 容器id bash
  3. 查看密码 vi opt/sonatype/sonatype-work/nexus3/admin.password

注意: 查看运行中的容器时,会看到有两个正在运行的容器,注意 NAMES 的区别,我们要进入的是 nexus 的容器,不要进错了。

2 使用 maven-publish 插件上传 aar

2.1 上传aar

其实步骤也很简单,但是网路上教程要不过期,要不不全面,给我们造成了很多干扰。

我们在需要上传的 Module 的 build.gradle 文件中做如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apply plugin: 'maven-publish'
//.......其他的配置
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
//小驼峰flavorBuildType
from components.release
//必填的三个内容,组id,工件id,版本
groupId = 'xyz.junerver.fileselector'
artifactId = 'file-selector-phone'
version = '1.1'
}
}
repositories {
//如果有多个仓库需要上传,就写几个maven{}
maven {
//如果私服是http的协议需要写这行配置
allowInsecureProtocol = true
//名称可以随便起
name = "nexus"
//私服仓库地址
url = "http://localhost:8081/repository/maven-releases/"
credentials {
username = '私服账号'
password = '私服密码'
}
}
}
}
}

重要:from components.release,这里是小驼峰的variant,没有flavor的话直接写buildType,有的话用小驼峰flavorBuildType;

添加如上配置后同步项目后,点开边栏的 Gradle应该出现如下的项目:

Gradle中出现的新的Task

红线标记的 Release 是我们上面声明的产物名称,后面的 Nexus 则是对于我们声明的 maven 私服的名称。
点击该条目就会发布我们库到 Maven 私服了!

2.2 添加依赖

与上传时需要声明 maven 一样,我们需要在 allprojects 下的 repositories 添加我们私服的信息,然后添加依赖。

1
implementation 'groupId:artifactId:version'

这样写是带着 pom 信息中声明的依赖,如果只想单纯依赖 aar,而不依赖库中声明的依赖关系,可以在版本后面加上 @aar