美文网首页版本构建
android 搭建maven私服管理类库

android 搭建maven私服管理类库

作者: 何一涛 | 来源:发表于2016-07-11 01:31 被阅读787次

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

    相关文章

      网友评论

        本文标题:android 搭建maven私服管理类库

        本文链接:https://www.haomeiwen.com/subject/plodjttx.html