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

但是公司项目的模块又不能开源怎么办?那就只有搭建一个 Maven 私有仓库了

尝试搭建 Sonatype Nexus Repository

首先了解一下 Nexus Repository Manager OSS 和 Nexus Repository Manager 的区别…

Nexus Repository Manager OSS ,之前叫做 Nexus OS,是开源免费的。( OSS = Open Source Software,开源软件免费 )

Nexus Repository Manager,之前叫做 Nexus Professional。只有拥有一个有效的许可证才可以使用所有功能( 专业版需要收费 )

emmm,专业版我就不去看了,免费版官网下载地址:https://www.sonatype.com/download-oss-sonatype

运行安装还是比较简单的,我这里吐槽一下需要的配置,需要4核2G以上的机子才能勉强跑起来…

需要 java 环境要求 Java 8 Runtime Environment 或者以上

# 查看 Java 版本( 怎么安装 Java 在这里就不讲了,可以使用 apt 安装或者编译安装我博客 bin.zmide.com 有相关博客 )

java -version

解压下载的压缩文件后进入 nexus-3.18.1-01/bin 文件夹( 3.18.1-01 是我下载的版本号 )

# run 指令会输出日志文件,程序运行在前台

# Unix & OS X 
./nexus run

# Windows  
nexus.exe /run


# start 指令不会输出日志文件,程序会在后台运行

# Unix & OS X 
./nexus start

# Windows  
nexus.exe /start

启动需要一分钟左右,控制台显示如下,表示成功启动服务

Started Sonatype Nexus OSS

打开浏览器,输入 http://localhost:8081/ 就可以看到管理界面( 服务器的话就是你的域名,默认端口就是 8081 )

默认的用户名是 admin 密码在你第一次点击登录的时候会提示有一个文件路径使用 cat 命令查看默认随机密码,第一次登录成功后会提示你设置一个新密码的

OK 现在使用 nexus 搭建的 maven 私有仓库已经准备好了,接下来是如何上传Library 和如何添加依赖

怎么上传 Library 到仓考,Library Moudle 的 gradle.properties 文件里配置上传参数

# 上传的Library信息
GROUP=com.zmide.module
VERSION_NAME=1.0.0
POM_ARTIFACT_ID=moduletest

# 上传的目标仓库地址
SNAPSHOT_REPOSITORY_URL=http://localhost:8081/repository/maven-snapshots/
RELEASE_REPOSITORY_URL=http://localhost:8081/repository/maven-releases/

# Nexus私服的用户名称和密码
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123

然后在 Library Moudle 的 gradle.properties 文件里加上

apply plugin: 'maven'

def isReleaseBuild() {
    return VERSION_NAME.toUpperCase().contains("SNAPSHOT") == false
}
def getRepositoryUsername() {
    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
def getRepositoryUrl() {
    return isReleaseBuild() ? RELEASE_REPOSITORY_URL : SNAPSHOT_REPOSITORY_URL
}
afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                pom.groupId = GROUP
                pom.artifactId = POM_ARTIFACT_ID
                pom.version = VERSION_NAME
                repository(url: getRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
            }
        }
    }
    task androidJavadocs(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }
    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
        classifier = 'javadoc'
        from androidJavadocs.destinationDir
    }
    task androidSourcesJar(type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.sourceFiles
    }

   //解决 JavaDoc 中文注释生成失败的问题
    tasks.withType(Javadoc) {
        options.addStringOption('Xdoclint:none', '-quiet')
        options.addStringOption('encoding', 'UTF-8')
        options.addStringOption('charSet', 'UTF-8')
    }
    artifacts {
        archives androidSourcesJar
        archives androidJavadocsJar
    }
}

也可以把以上 build.gradle 中的配置,创建一个 gradle 文件,例如 upload_nexus.gradle 中,然后在 build.gradle 中引用 upload_nexus.gradle

apply from: 'upload_nexus.gradle'

配置已经完成,打开Android Studio 中打开右侧的 Gradle 侧边栏,打开 这个module library,可以看到 uploadArchives,这就是刚才创建的上传 Task,点击即可完成上传

如果 uploadArchives Task 执行成功,在 Nexus 仓库中可以看到上传的内容

点击左侧导航栏 Browse - maven-public 就可以看到

在项目中使用添加私有库依赖,项目根路径的build.gradle

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'http://localhost:8081/repository/maven-public/' }
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'http://localhost:8081/repository/maven-public/' }
    }
}

然后,在需要引用该三方库的目标 Module 的 build.gradle 中添加此库的依赖

dependencies {
    implementation 'com.zmide.module:moduletest:1.0.0'
}

就可以正常使用私有 Library 了

好像除了 Sonatypec 的 Nexus 还有有两个比较流行的 Maven 仓库管理软件可以创建私服,Apache 基金会的 Archiva,JFrog 的 Artifactory