为什么要搭建maven私有仓库
当公司的项目发展到一定阶段,人员发展到一定规模,项目必定要经历组件化改造。
项目组件化之后,每个人或每个业务线只负责特定的模块。那么各个模块之间如何依赖呢?
有两种方法,一种是工程里直接源码依赖,就是这种:
implementation project(":libraryXXX")
这种方式有两个显著的弊端:
1、编译的时候,会同时编译所有的library,每改一个小地方,就要全部编译一次,消耗时间长,开发效能低下。
2、任何人都可以互相修改对方负责的代码,造成职责分工凌乱。而且有时候基于安全上的考虑,并不想别人看到或修改某些源代码。放在maven仓库上后,别人就只能访问编译后的class字节码。
所以,我们需要另一种方式,就是搭建公司内部的maven私有仓库,采用maven远程依赖aar的方式。就是这种:implementation 'com.xxx.xxx:xxx:x.x.x‘
就像依赖appcompat库一样:implementation 'androidx.appcompat:appcompat:1.0.2'
使用maven私有仓库有以下优点:
-
当你修改了代码添加了新功能,通过gradle命令一键上传到maven私有仓库,别人只需要刷新本地缓存或者增加版本号即可更新。
-
每个人负责的项目看起来十分轻量级,甚至一个project里只有一个module。
-
因为aar已经编译过了不再重新编译,只编译你自己的module。这样编译更加快,开发效能更高。
-
职责分工更清晰明确,维护成本更低。
-
使用公司内部maven仓库,第三方库也会缓存在这个仓库,优先从局域网下载会更快。
如何搭建(安装)maven私有仓库
一般我们采用Sonatype公司的nexus3来搭建maven仓库。有两种安装方式。
方式一,直接从官网下载nexus3安装包
下载地址:
https://help.sonatype.com/repomanager3/download
根据自己的系统选择对应的版本。下面Mac OSX系统为例。
笔者下载后是这个包:nexus-3.23.0-03-mac.tgz
下载完成后将包解压,直接运行启动命令即可:/xxx/nexus-3.23.0-03-mac/nexus-3.23.0-03/bin/nexus
方式二,使用docer安装nexus3(推荐)
使用docker好处就是安装简单,不用配置环境,而且所有配置跟你电脑隔离。同样以Mac OSX为例。
第一步,安装docker(如果没安装)
shell命令:
brew cask install docker
安装后doshboard应用列表中会有图标。
第二步,在docker上搜索nexus3镜像
shell命令:
docker search nexus
选择第一个星星最多的。
第三步,下载nexus3镜像
shell命令:
docker pull sonatype/nexus3
第四步,启动nexus服务
shell命令:
docker run -d -p 8081:8081 sonotype/nexus3
参数解释:
-d 在后台运行
-p 8081:8081 将8081端口映射到docker中的8081端口。
sonotype/nexus3 镜像名称
如果运行以上命令后没反应,尝试重启一下docker再运行以上命令。
至此,已经完成了nexus3的安装和启动。下面直接访问。
在浏览器中访问:http://localhost:8081/nexus3/
第一次访问需要设置密码。
maven私有仓库的使用
进入到:nexus3首页-Browse
可以看到,默认已经为我们创建了几个仓库,其中红色框内的是笔者自己创建的仓库。
仓库有两种格式(Format),一个是maven2,一个是nuget的,一般我们只需要用到maven2的,nuget可以忽略。
仓库的名字是自己取的,这个可以任意,不要被名称迷惑。
我们重点关注仓库的类型(Type)。仓库有三种类型,分别是hosted、proxy、group。
- hosted类型:即我们自己的宿主仓库,专门存储我们自己的aar或jar,上传aar也是上传到这种仓库。
- proxy类型:即用来代理中央仓库的,中央仓库就是maven或google或jcenter或其它组织公开的仓库,创建这种仓库的时候,需要填写一个中央仓库的url即可。为什么要加proxy仓库呢,因为你的aar中可能依赖了maven central或jcenter或google的aar,它会去代理仓库中去找这些aar,找到后会下载到你的maven仓库中。
- group类型:仓库组,即我们自己对外的仓库。它是一个仓库组,我们可以将hosted类型和proxy类型的仓库按照指定顺序加到这个仓库组中。在Android Studio的root project的build.gradle中填写仓库地址就是这个。在依赖aar或jar的时候,就是在group仓库组中按照仓库顺序寻找aar。
笔者的maven-public(group仓库)中已经可以看到下载后的第三方库。如下图。
如何创建仓库
先登录到nexus3。
选择一中仓库类型
创建proxy类型仓库
其它保持默认即可。笔者创建的proxy仓库中已经可以看到自动下载的第三方库。如下图:
一般我们要创建三种proxy类型仓库,以便我们的aar中依赖的第三方库能够找到。
-
maven-central (默认已创建):
https://repo1.maven.org/maven2/
nexus3默认创建的名maven-central的代理仓库配置的地址即是这个。 -
jcenter仓库:
https://jcenter.bintray.com/
笔者nexus3中名为jcenter的代理仓库配置的地址即是这个。 -
google maven仓库:
https://dl.google.com/dl/android/maven2/
笔者nexus3中名为dl_google_maven2的代理仓库配置的地址即是这个。
创建hosted类型仓库
因为默认已经为我们创建了hosted类型创建,一般不需要创建。如有需要也可以创建或修改。
创建group类型仓库
同样nexus默认已经为我们创建了hosted类型创建,一般不需要创建。如有需要也可以创建或修改。
在gradle中配置仓库url
回到首页-Browse
选择group类型的仓库,点击copy按钮,会弹出来仓库地址,复制并粘贴到root project中的build.gradle即可。如下。在allprojects中加上私有库。当然供别人使用时,“localhost”要替换成机器ip地址。
很多其它资料教程中,说在buildscript中和allprojects中都要加私有库地址,其实只需要在allprojects中加上即可,没必须在buildcript中也加上。因为buildcript中repositories是rootProject的库的地址,用于下载插件的。allprojects中的repositories是给每个子project配置源代码库的。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven{
url 'http://localhost:8081/nexus3/repository/maven-public/'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
如何上传aar(Library)
关于如何上传aar,准备用新的篇幅来讲解,请看我的另一篇文章:
将aar及其依赖aar上传至maven私有仓库