Android 使用Nexus搭建本地私有Maven仓库

时间:2024-03-26 08:22:15

一、前言

在Android开发中,经常有一种场景:需要将写好的某个lib用于各个不同的项目中。

做法有二:1、将lib直接导入到项目中,缺点:繁琐,一旦lib项目出现bug,所有导入的项目都要去修改。2、放到仓库中,使用  implement "xxx"  添加依赖,这样更简单,一旦lib出现bug,只需修改lib项目,发布新版本,所有需要依赖的项目修改版本号就可以了。

二、Maven仓库

1、分类

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

需要注意的是,*仓库的服务器压力较大,因此下载速度会很慢,并且上传到*仓库的包都是开源的,处于某些需要,有些包并不适合开源,因此我们可以选择把它保存到私服仓库中。

2、依赖包下载顺序

我们在使用maven的时候,对于项目所依赖的jar包,maven默认会在*仓库下载jar包,到本地的磁盘目录(如果没有配置则是用户目录下/.m2/repository文件夹下)。如果公司内部搭了一个maven私服的话,开发人员将仓库地址指向内网仓库地址,需要的jar包可直接在私服取,下载速度比远程要快,如果本地仓库没有则自动从远程下载并保存在本地。

三、使用 Nexus 搭建一个私服

1、Nexus官网 下载最新版本,我选择的是 oss免费版本,目前免费版最新版本是2.14.11

Android 使用Nexus搭建本地私有Maven仓库

2、解压,安装

压缩包里有 nexus-2.14.11-01和 sonatype-work 两个文件夹,进入nexus-2.14.11-01/bin/jws,选择对应系统和位数,比如我选择的是:windows-x86-64,

Android 使用Nexus搭建本地私有Maven仓库

依次右击install-nexus,和start-nexus,选择 管理员身份运行

Android 使用Nexus搭建本地私有Maven仓库

在浏览器输入http://localhost:8081/nexus,出现如下界面则表明安装成功

Android 使用Nexus搭建本地私有Maven仓库

3、配置nexus

点击右上角 Login ,使用默认账号密码 admin/admin123 登录,点击左侧Repositories,可以看到:

Android 使用Nexus搭建本地私有Maven仓库

注意一下

Type 列(Nexus 仓库分类)

(1)proxy(远程代理仓库) 
这种类型的仓库,可以设置一个远程仓库的链接。当用户向 proxy 类型仓库请求下载一个依赖构件时,就会先在自己的库里查找,如果找不到的话,就会从设置的远程仓库下载到自己的库里,然后返回给用户,相当于起到一个中转的作用。例如 maven-central 用来存储从 Maven *仓库下载过的构件。

(2)group (聚合仓库)
在 Maven 里没有这个概念,是 Nexus 特有的。目的是将多个仓库聚合,对用户暴露统一的地址,这样用户就不需要配置多个地址,只要统一配置 group 的地址就可以了。group 仓库的聚合成员可以在仓库设置中添加和移除。例如 maven-public 是一个 group 类型的仓库,通过引用这个地址,可以访问组内成员仓库的所有构件。

(3)hosted(宿主仓库) 
我们自己的依赖仓库,目前 maven-releases 和 maven-snapshots 是 hosted 类型的仓库。我们可以上传到这两个仓库,也可以自己创建 hosted 仓库。

Repositories列:

Public Repositories:  仓库组

3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库

Apache Snapshots: 用了代理ApacheMaven仓库快照版本的构件仓库

Central: 用来代理maven*仓库中发布版本构件的仓库

Central M1 shadow: 用于提供*仓库中M1格式的发布版本的构件镜像仓库

Releases: 用来部署管理内部的发布版本构件的宿主类型仓库

Android 使用Nexus搭建本地私有Maven仓库

release和snapshot仓库的区别:

release 仓库不能重复上传同一版本号,版本不能覆盖,只能迭代,snapshot 仓库允许版本覆盖。当我上传多次上传同一个版本到 snapshot 仓库,会自动在版本号后面添加时间戳来区分。

迭代开发的不稳定版本放到snapshot仓库中,版本可覆盖,测试的时候不需要改版本号,最多清理一下maven的依赖缓存就可以下载到最新版本,正式发布的时候使用release版本

 

四、上传依赖包到Nexus私有仓库

1、在module的gradle.properties文件(若没有则新建一个)中添加maven仓库信息

GROUP_ID = com.kwmax.login
ARTIFACTID = componentexample
LIBRARY_VERSION = 1.0-SHAPSHOT

#上传的目标仓库地址
SNAPSHOT_REPOSITORY_URL = http://localhost:8081/nexus/content/repositories/snapshots/
RELEASE_REPOSITORY_URL = http://localhost:8081/nexus/content/repositories/releases/

#Nexus账号
NEXUS_USERNAME = admin
NEXUS_PASSWORD = admin123

2、在最外层project的build.gradle文件中添加 自动化maven打包工具:

dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        //自动化maven打包
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }

3、在module的build.gradle文件中配置脚本:

apply plugin: 'maven'
def isReleaseBuild() {
    return LIBRARY_VERSION.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
}

以上内容添加在android{}之上,然后在android{}中添加:

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                pom.groupId = GROUP_ID
                pom.artifactId = ARTIFACTID
                pom.version = LIBRARY_VERSION
                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
    }
}

4、右侧Gradle工具,进行uploadArchives一下,成功之后可以看到包已经上传到仓库了

Android 使用Nexus搭建本地私有Maven仓库

五、引用仓库中的包

1、在project的build.gradle文件中allprojects下面添加下载私有库的路径:

allprojects {
    repositories {
        google()
        jcenter()
        maven{
            url 'http://localhost:8081/nexus/content/repositories/releases/'
        }
        maven{
            url 'http://localhost:8081/nexus/content/repositories/snapshots/'
        }
    }
}

2、dependencies中添加引用:

格式:implementation  'GROUP_ID : ARTIFACTID : LIBRARY_VERSION'