快速发布Android Library的几种方式

在日常开发中,我们经常需要将一个library发布到maven服务器上,供其它人来使用。这其中一般包括发到本地供自己调试使用、发到私服供项目使用、发到外服对外公开使用三种情况。本文针对这三种情况,一一介绍如果快速的完成library的发布。

发布到本地

我们可以使用maven-publish这个plugin来将一个编译后library发布到本地仓库。

只需要在需要发布的library的build.gradle文件中加入下面的代码:

apply plugin: 'maven-publish'

task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'YOUR_GROUP_ID'
            artifactId project.name
            version 'YOU_VERSION'
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
            artifact generateSourcesJar
        }
    }
}

tasks.whenTaskAdded {
    task ->
        if ("assembleRelease".equals(task.name)) {
            publishToMavenLocal.dependsOn assembleRelease
        }
}

我们只需要将上面代码中的YOUR_GROUP_IDYOU_VERSION按需修改即可。改好之后运行

./gradlew publishToMavenLocal

即可将library发布到本地。本地maven的位置在用户家目录的.m2/repository中,我们可以按照library的group id来索引位置:

发布后的内容如下:

引用本地仓库

如果我们想引用本地仓库,只需要在项目根目录的build.gradle文件的 allprojects\repositories中添加mavenLocal()即可,示例如下:

allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
    }
}

发布到私有服务器

如果我们的library不仅自己在用,还需要对项目组的其它人使用,我们就需要将我们的library发布到我们项目组的私有maven服务器上。

搭建私有maven仓库

目前比较通用的搭建私有maven仓库的方法是使用nexus,本文也是基于此款软件来搭建的。搭建nexus的方式比较多,个人推荐使用docker-compose来安装,一来比较简单,二来备份也很方便。

nexus的官方docker仓库是https://hub.docker.com/r/sonatype/nexus/, 我们可以以此来编写一个docker-compose版本的脚本:

version: '2'

services:
  nexus:
    restart: always
    image: sonatype/nexus
    ports:
    - 8081:8081
    volumes:
    - YOUR_LOCAL_PATH:/sonatype-work
    environment:
    - MAX_HEAP=1024m
    - MIN_HEAP=1024m

我们只需要将上面脚本的YOUR_LOCAL_PATH换成我们服务器上的一个目录即可,在此脚本的目录下运行docker-compose up -d,即可在当前的8081端口下开启一个nexus服务。

nexus的默认账户为admin,密码为admin123

发布到私有maven仓库

搭建好了nexus之后,我们就可以向nexus中发布自己的library了。我们依然可以使用maven-publish这个插件来发布。只需要在刚才发布到本地的代码基础上增加一些内容即可,更新后版本如下:

apply plugin: 'maven-publish'

task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

publishing {
    publications {
        maven(MavenPublication) {
            groupId 'YOUR_GROUP_ID'
            artifactId project.name
            version 'YOUR_VERSION'
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
            artifact generateSourcesJar
        }
    }
    repositories {
        maven {
            url "http://YOUR_NEXUS_SERVER_IP:YOUR_NEXUS_SERVER_PORT/nexus/content/repositories/releases"
            credentials {
                username = "YOUR_NEXUS_SERVER_USER_NAME"
                password = "YOUR_NEXUS_SERVER_USER_PASSWORD"
            }
        }
    }
}

tasks.whenTaskAdded {
    task ->
        if ("assembleRelease".equals(task.name)) {
            publishToMavenLocal.dependsOn assembleRelease
            publish.dependsOn assembleRelease
        }
}

主要是在publishing中增加repositories代码块,将自己的nexus相关信息配置上去即可。

运行 ./gradlew publishToMavenLocal 发布library到本地仓库

运行 ./gradlew publish 发布library到nexus仓库

引用nexus仓库

引用nexus仓库和引用本地仓库基本相同,示例如下:

buildscript {
    repositories {
        mavenLocal()
        maven {
            url 'http://10.240.133.99:8079/nexus/content/groups/public/'
        }
        google()
        jcenter()
    }
    ...
}

发布到jcenter

发布到私有maven库已经可以满足我们日常的工作需求,但如果我们是热爱分享的人,我们肯定希望我们编写的library能攻提供给更多的人来使用。在android项目中,会在repositories中默认添加了jcenter仓库:

所以我们只需要将自己的library发布到jcenter上,别人就可以很方便的下载我们的library了。

注册jcenter

前往bintray.com/signup/oss 进行注册,然后登陆。

登陆之后我们需要两个参数,一个是我们的用户名,另外一个就是api key,api key的获取可以参照我下面的gif图片:

bintary api key

请牢记这两个值,一会上传需要用到。

发布library

发布到jcenter最方便的方法是使用com.novoda.bintray-release,方法如下:

牢记上面package自己填写的name字段。

apply plugin: 'com.novoda.bintray-release'

tasks.withType(Javadoc) {
    options{ encoding "UTF-8"
        charSet 'UTF-8'
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}

publish {
    userOrg = 'YOUR_JCENTER_USER_NAME'
    groupId = 'YOUR_GROUP_ID'
    artifactId = 'YOUR_PACKAGE_NAME'
    publishVersion = 'YOUR_VERSION'
    desc = 'YOUR_CUSTOM_DESC'
    website = 'YOUR_CUSTOM_WEBSITE'
}

更换publish中的相应字段。

最后执行

/gradlew clean build bintrayUpload -PbintrayUser=YOUR_JCENTER_USER_NAME -PbintrayKey=YOUR_API_KEY -PdryRun=false

即可发布成功:

此时发布的library并不能被别人通过jcenter直接引用。你需要点进library详情页面,点击Add to JCenter按钮,将其提交给工作人员审核,审核通过后,别人就可以使用了。