Android 搭建maven私服管理类库

2016-07-11

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 打开所在文件的目录,拷贝其中类库即可。

Comments
Write a Comment