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

790 阅读3分钟

1 Maven 与 Maven 私服

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

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镜像,使用起来也很简单:

//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 文件中做如下修改:

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 添加我们私服的信息,然后添加依赖。

implementation 'groupId:artifactId:version'

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