android 开发时,类库依赖管理一般是拷贝到相应 libs 目录然后配置文件中引用该类库,或者引用 jceneter 中第三方类库等。前者简单粗暴但是一旦类库有新版本更新,需要重新拷贝一份库到该目录下更新,同时造成整个工程初次check下来时体积偏大。后者可能受限于网络会导致很多类库无法获取导致编译失败等问题。
如果我们能在本机或者局域网服务器搭建并使用 maven 仓库,一来可以解决更新类库靠拷的原始方式,二来也不用担心连不上外网导致获取类库失败。对拥有多个项目或模块的公司和团队来说,使用 maven 私服管理类库对提升团队整体开发效率至关重要。
一、maven 私有仓库搭建
安装启动
先在 nexus 官网 下载适合你机器的版本,我这里选择的是 nexus-3.0.1 mac 版本。
wget https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.0.1-01-mac.tgz -P ~/work/
解压
cd ~/work/
tar -zxvf nexus-3.0.1-01-mac.tgz
启动 nexus 服务
cd cd nexus-3.0.1-01/bin/
./nexus start
// ./nexus stop
服务启动成功后可以从浏览器中打开 nexus 管理后台并登陆,默认用户名为 admin ,默认密码为 admin123 。
简单配置
首先需要创建一个新的 repository 用于存放公共类库,这里我们设置 repo 的名称为 test ,选择 repo 的类型为 maven2(hosted) ,并把 Deployment policy 设置为 Alow redeploy 。
nexus-new-repo.png其次是要创建一个用于上传类库的公共账号,并控制这个账号的权限,具体过程可以多看看左侧导航中 Security 下面的 Privileges 、Roles 、Users 很快就能搞明白,这里不再阐述,我们先使用默认的用户名 admin 和密码 admin123 上传类库 。
二、maven 私有仓库使用
这里假设你把 nexus 安装在了本机,仓库地址为 http://localhost:8081/repository/test/ 。如果把 nexus 安装在了局域网服务器,基本类似,只是仓库地址中的 localhost 改为局域网服务器 ip 。
上传类库
假设我们有一个有关 android 通用工具类的公共库 CommonUtils.jar 需要上传到仓库,供团队成员使用。
1.参考这里配置仓库和类库的相关信息,在项目 gradle.properties 添加以下属性
# maven local config
maven_local_url=http://localhost:8081/repository/test/
maven_local_username=admin
maven_local_password=admin123
# common utils
maven_pom_version=1.0.0
maven_pom_groupid=im.het
maven_pom_artifactId=commonutils
maven_pom_packaging=jar
maven_pom_description=android common utils
maven_pom_archives_file=libs/CommonUtils.jar
说明 :
- maven_local_url maven仓库中相应repository的地址
- maven_local_username 上传类库到仓库的用户名
- maven_local_password 上传类库到仓库的密码
- maven_pom_version 要上传的类库的版本号
- maven_pom_groupid 类库的分组标记,一般使用公司名或包名即可
- maven_pom_artifactId 类库的名称
- maven_pom_packaging 类库的格式可以支持 jar ,aar , so 等
- maven_pom_description 类库描述
- maven_pom_archives_file 类库文件在项目中的位置(相对于 build.gradle)
2.在相应类库所在的 module 的 build.gradle 增加上传类库的 task
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
repository(url: maven_local_url) {
authentication(userName:maven_local_username ,password: maven_local_password)
}
pom.project {
version maven_pom_version
artifactId maven_pom_artifactId
groupId maven_pom_groupid
packaging maven_pom_packaging
description maven_pom_description
}
}
}
}
artifacts {
archives file(maven_pom_archives_file)
}
说明 :
- artifacts 中可以指定要上传的 jar 或 aar 的路径,为统一配置都由 gradle.properties 的属性 maven_pom_archives_file 指定
- 如果只需要上传项目编译时产生的 aar,artifacts 可以省略,因为 artifacts 默认就包含了编译产生的 aar 或 apk
**3.运行上传类库的 task 即可把相应类库上传到仓库 **
gradle uploadArchives
如果上传成功,一般可以在这里看到相关类库了。
下面是我们上传类库 commonutils 到 test repo 后的文件列表,可以看到其中有 aar 文件存在,这是因为 artifacts 中默认包含了编译产生的 aar 文件 ,可以在这里删除 aar 相关文件,因为我们只希望有 jar 的存在。
browse-repo-test.png更新类库
如果类库需要更新版本,基本操作同上。
比如类库 commonutils 有了新版本为 2.0.0 ,先修改 gradle.properties 配置如下
maven_pom_version=2.0.0
...
maven_pom_archives_file=libs/CommonUtils2.0.jar
再运行上传类库的 task 即可。
使用类库
在需要使用类库的项目的 build.gradle 文件里面加入以下即可在项目中使用 commonutils 类库了。
allprojects {
repositories {
jcenter()
mavenLocal()
}
dependencies{
repositories {
maven {
url 'http://localhost:8081/repository/test/'
}
}
}
}
dependencies {
compile 'im.het:commonutils:1.0.0'
}
类库更新版本后,有没方法不更改 gradle 配置文件自动获取最新类库
可以的,gradle 支持依赖库动态版本。比如要使用 commonutils 1.2.1 这个版本,一般在 build.gradle 文件里是这样写的 :
dependencies {
compile 'im.het:commonutils:1.2.1'
}
如果不想依赖具体版本,想每次从 maven 仓库中拉取最新的库,可以这样:
dependencies {
compile 'im.het:commonutils:1.+'
}
也可以这样配置
dependencies {
compile 'im.het:commonutils:+'
}
用”+”通配符来匹配最新的符合要求的版本,这样做的好处是如果 maven 仓库上有新版本库了,不用修改类库的依赖配置版本,gradle 编译的时候会自动拉取最新版本。但这样也会带来两个麻烦:
- 有可能新版本类库的接口改了,导致编译失败,这个时候需要修改代码做接口适配
- 会使 gradle 构建速度变慢,因为每次 gradle 编译完整的项目,都会去 maven 仓库上尝试拉取最新版本的类库,这样会拖慢编译速度,尤其在网络差的时候,不过我们这里的仓库一般是在本机或局域网,拉取最新版本并下载的这点时间一般很快可以忽略。
使用私有仓库解决依赖后,我想拷贝其中的 jar 包,怎么找
在工程下的 External Libraries 可以看到相应的类库,这些类库默认是放在 gradle 缓存目录的 (在 linux 环境中,一般是在 ~/.gradle/caches 下面 )。 可以右键点击 Reavel in Finder 打开所在文件的目录,拷贝其中类库即可。
网友评论