在前边组件化开发的相关文章中,我们提到了开发中我们可以把一些共有的功能库比如网络库、图片加载库、工具库等等提取封装后,作为基础(library)库来使用,这些库提取出来之后,要怎么使用呢?还需要每个开发人员把源码文件导入使用,显然这样的方式并不方便,而且不利于基础库的维护,那么我们能不能像依赖其他第三方库那样用gradle从仓库下载呢?答案是肯定的。我们可以搭建公司团队自己的Maven私有仓库。
Maven 的远程仓库分为中央仓库和私服仓库。中央仓库存放了世界各地用户上传的依赖包,比较出名的是 JCenter 和 Maven Central,开源的第三方依赖一般都会上传到这两个中央仓库,这样我们只用添加这两个中央仓库的链接地址,就可以下载各种我们需要的依赖了。在公司内部,搭建一个 Maven 仓库,可以上传平常开发中常用的开发库或者封装的代码,把公司内部不想开源的依赖包上传到私服仓库中,有更好保密性、安全性和统一性。
通过建立团队自己的开发仓库,可以统一开发人员的编码规范,统一开发框架,统一一些功能的使用等等,方便团队管理,也利于团队人员的相互配合等等。
下面根据我通过Sonatypec 的 Nexus创建Maven私有仓库做一些介绍,供大家参考...
使用Nexus搭建Maven私有仓库
下载运行Nexus
去Sonatypec官网 下载软件包, 根据你的操作系统选择下载,这里以windows操作系统为例。
下载完成之后,我们解压压缩包到一个文件夹下(例如:D:\nexus-3.24.0-02-win64),里面包含nexus-3.24.0-02和sonatype-work
然后进入到D:\nexus-3.24.0-02-win64\nexus-3.24.0-02\bin目录中
软件没有图形安装界面,我们需要进入命令行运行nexus.exe
在安装Nexus前,请确保系统已经安装了JDK1.8及以上的java环境
然后可以用 nexus.exe /run命令启动Nexus:
使用run命令可以直接启动Nexus,这样启动Nexus并没有将它安装到windows服务中,虽然简单,但是如果服务器重启,那么就需要人为干预。在当前命令行窗口中按住CTRL-C就可以关闭Nexus。我们放在局域网服务器上,当服务器因为一些原因重启时,需要人工干预,显然是不太符合我们的要求的。
我们可以使用nexus.exe /install nexus命令,将Nexus安装到windows服务中,然后设置成自动启动,就可以在服务器重启后,自动启动私服了。
注意:运行该命令需要以管理员身份运行cmd命令行窗口(即在windows附件中,找到命令提示符->右键->以管理员身份运行)
这样就可以在windows服务中看到已经安装的nexus服务
这里我们可以启动/关闭服务,也可以设置服务是自动/手动
安装nexus服务成功并启动后,我们就可以访问nexus了。
访问nexus
服务启动后就可以通过浏览器访问,默认端口为8081,可以通过服务器IP加端口号直接访问(http://<server_host>:8081)
默认账号为admin,密码为admin123。登录之后我们可以在用户中心修改密码。
maven仓库类型
maven仓库类型只有3中,分别是: hosted、proxy、group
- hosted:宿主类型 内部项目的发布仓库,专门用来存储我们自己生成的jar文件,aar文件。我们自己上传的开发库,就是上传到该类型下的仓库中。
- proxy:代理类型 从远程中央仓库中寻找数据的仓库,如可配置阿里云maven仓库。
-
group:组类型 Nexus通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。
简单来说: group = hosted+proxy
[图片上传失败...(image-a4e4f4-1620527640953)]
如上图所示,maven-public就是默认创建的组仓库。
版本类型
- release:专用于部署发布版本的jar或aar,对应maven-release宿主仓库。
- snapshot:专用于部署快照版本的jar或aar,都是以-SNAPSHOT结尾,pom中version需以-SNAPSHOT(必须大写)结尾,对应maven-snapshot仓库。
- mixed:可包含release和snapshot版本
权限管理
数据权限:repository权限有两种类型:
- repository admin
- repository view
每种类型又有5种权限标识,分别是:add,browse、delete、edit、read。 可以根据需要进行账户配置。
上传library库到仓库
我们在本地开发,封装后开发库之后,怎么上传到仓库呢,这里以一个简单的例子为例。我在本地新建了一个Autobio_Android的Android工程,这里我们再新建一个Android Library的module(名字为utilcode),这个模块就是我们封装开发完后要上传到仓库中,供其他人使用的library库,或者aar文件。
要上传到仓库,还是利用gradle自动化构建的一些东西。
一、在工程的gradle.properties文件中,配置需要使用全局信息
如上图所示,我们可以配置maven-releases仓库(一般是存放开发比较成熟稳定的库)的地址和maven-snapshots仓库(一般存放处于开发阶段的,可能会随时更改的库)的地址;还有NEXUS的用户名和密码;一般一个公司一个团队的groupId都是一样的,所以这里也配置一下GROUP_ID。
GROUP_ID:比如我们依赖第三方库implementation 'io.reactivex.rxjava2:rxjava:2.1.12',这个rxjava库的GROUP_ID就是io.reactivex.rxjava2,我们添加依赖库就是:GROUP_ID:artifactId:版本号。
二、在要上传的library模块的build.gradle文件中添加配置上传代码
这里为了整洁性,就把这部分代码单独提出来,在utilcode模块下新建一个upload_nexus.gradle的gradle文件,具体代码如下:
apply plugin: 'maven'
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
snapshotRepository(url: MAVEN_SNAPSHOT_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
repository(url: MAVEN_URL) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
}
pom.project {
version '0.0.2-SNAPSHOT'
groupId GROUP_ID
artifactId 'util-code'
packaging 'aar'
description 'dependences lib'
}
}
}
}
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
}
}
upload_nexus.gradle编写完之后,我们把该文件引入utilcode模块的build.gradle中,如下图所示:
三、上传library开发库模块
配置已经完成,打开Android Studio 中打开右侧的 Gradle 侧边栏,打开 这个module library,可以看到 uploadArchives,这就是刚才创建的上传 Task,点击即可完成上传
如果 uploadArchives Task 执行成功,在 Nexus 仓库中就可以看到上传的内容了。点击左侧导航栏 Browse - maven-snapshot 就可以看到我们上传的开发库了,如下图所示:
在项目中使用上传的开发库
上传到仓库中了之后,我们在项目中如何使用呢?,他的使用和我们添加依赖使用第三方库是一样的。