一、前言
在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
2、解压,安装
压缩包里有 nexus-2.14.11-01和 sonatype-work 两个文件夹,进入nexus-2.14.11-01/bin/jws,选择对应系统和位数,比如我选择的是:windows-x86-64,
依次右击install-nexus,和start-nexus,选择 管理员身份运行
在浏览器输入http://localhost:8081/nexus,出现如下界面则表明安装成功
3、配置nexus
点击右上角 Login ,使用默认账号密码 admin/admin123 登录,点击左侧Repositories,可以看到:
注意一下
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: 用来部署管理内部的发布版本构件的宿主类型仓库
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一下,成功之后可以看到包已经上传到仓库了
五、引用仓库中的包
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'