Publish Gradle Android Library to jCenter Repository

Hujiawei Bujidao


     

Publish Gradle Android Library to jCenter Repository


本文主要介绍如何通过Gradle将Android库项目上传到jCenter仓库中。

经常使用开源项目的童鞋肯定很喜欢以Maven或者Gradle的形式来导入其他的开源库,但是那些开源库是怎么放到开源库的仓库中的呢?之前Android Studio默认使用的Maven Central仓库,现在改为使用jCenter仓库,感兴趣可以阅读Android Studio – Migration from Maven Central to JCenter这篇文章了解下为什么。

必要知识:Gradle

这里只是列举一些必要的关于Gradle的知识,具体的详细介绍可以参考其他文档,例如Gradle官网的Gradle User Guide或者http://tools.android.com/Gradle Plugin User Guide(也可以阅读我的注解版本gradle-plugin-user-guide)。

关于如何在Android Studio中使用Gradle,可以看下这篇教程Gradle Tutorial : Part 6 : Android Studio + Gradle

下面是从Gradle入门系列教程 (英文原版教程点这里)中摘取的重要知识,可以对Gradle做个大致了解。

(1)每一次Gradle的构建(build)都包含一个或者多个项目(project),每个项目中又包含一个或者多个任务(task)

(2)Gradle的设计理念是:所有有用的特性都由Gradle插件提供。Gradle插件能够在项目中添加新任务;为新加入的任务提供默认配置;加入新的属性,可以覆盖插件的默认配置属性;为项目加入新的依赖。

(3)本质上说,仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库。Gradle支持以下仓库格式:Ivy仓库;Maven仓库;Flat directory仓库。

在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是:

mavenCentral()别名,表示依赖是从Central Maven 2仓库中获取的。
jcenter()别名,表示依赖是从Bintary’s JCenter Maven仓库中获取的。
mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。

声明仓库示例(将Central Maven 2 仓库加入到构建中):

repositories {
    mavenCentral()
}

(4)最普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。一个外部依赖可以由以下属性指定:

group属性指定依赖的分组(在Maven中,就是groupId)。
name属性指定依赖的名称(在Maven中,就是artifactId)。
version属性指定外部依赖的版本(在Maven中,就是version)。

声明依赖格式:

dependencies {
    compile 'groupId:artifactId:version'
}

使用gradle-bintray-plugin插件

下面进入今天的主题,讨论如何通过Gradle将Android库项目上传到jCenter仓库中。这方面的博客还是有一些的,考虑到我以后会经常用到,还是打算写一篇自己的心得体会。参考网址如下:

使用Gradle发布Android开源项目到JCenter

Publishing Gradle Android Library to jCenter Repository

中文版本 使用Gradle发布项目到JCenter仓库

详细步骤如下:

1.注册Bintray账号

网址:https://bintray.com/

2.记录API Key

个人设置界面的左下角API key,复制保存该字符串

3.新建AS项目和库项目

在AS中新建项目,例如Polaris,再在项目中新建Module,选择Android Library Module,例如lib4polaris

4.打开项目根目录下的local.properties文件(如果没有就新建一个),输入你的Bintray账号的信息

bintray.user= [your name]
bintray.apikey= [your api key]

5.打开项目根目录下的build.gradle文件,修改dependencies部分,注意gradle需要使用1.1.2版本,如果使用的是1.1.0版本会出错的。另外添加两个重要的插件,其中android-maven-plugin插件用于生成JavaDoc和Jar文件等,gradle-bintray-plugin插件是用于上传项目到Bintray。

    dependencies {
        //when using gradle 1.1.0, there will be an error: Cannot call getBootClasspath() before setTargetInfo() is called
        //https://www.virag.si/2015/01/publishing-gradle-android-library-to-jcenter/
        classpath 'com.android.tools.build:gradle:1.1.2' //

        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-plugin:1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

6.打开库项目lib4polaris中的build.gralde文件,修改成以下内容,其中注释了#CONFIG#的地方都可以根据实际情况进行修改。下面的内容中添加了很多操作,例如定义pom并打包aar,打包javadocjar和sourcejar,上传到Jcenter仓库等。

更多关于配置上传到Bintray的参数可以参见项目gradle-bintray-plugin

apply plugin: 'com.android.library'

apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

version = "1.0.0"                                                              // #CONFIG# // project version

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    resourcePrefix "polaris_"                                                  // #CONFIG# // resource prefix

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.android.support:support-v4:22.1.1'
}


def siteUrl = 'https://github.com/hujiaweibujidao/Polaris'                    // #CONFIG# // project homepage
def gitUrl = 'https://github.com/hujiaweibujidao/Polaris.git'                 // #CONFIG# // project git url
def issueUrl = 'https://github.com/hujiaweibujidao/Polaris/issues'            // #CONFIG# // project issue url
group = "hujiaweibujidao.github.io"                                           // #CONFIG# // Maven Group ID for the artifact (pageckage name is ok)


//generate javadoc and jar

install {
    repositories.mavenInstaller {
        // generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'Polaris Library For Android'                             // #CONFIG# // project title
                url siteUrl
                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'hujiaweibujidao'                                  // #CONFIG# // your user id (you can write your nickname)
                        name 'hujiawei'                                       // #CONFIG# // your user name
                        email 'hujiawei090807@gmail.com'                      // #CONFIG# // your email
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

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

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}


//bintray upload

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "polaris"                                                   // #CONFIG# project name in jcenter
        desc = 'A helpful library for Android named Polaris.'
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        issueTrackerUrl = issueUrl
        licenses = ["Apache-2.0"]
        labels = ['android']
        publish = true
        publicDownloadNumbers = true
    }
}

7.选择工具栏中的Sync projects with Gradle files对项目进行重建,然后可以看到Gradle视图中的Task中出现了bintrayUpload,双击即可将项目上传到Bintray中。

image

8.在详情页中找到Maven Central标签,鼠标放上去它会提示你去提交到jCenter进行审核,点击进入后,写点内容就可以了,等待审核需要一定的时间。

image

9.审核通过之后,就可以在项目中通过很简单的方式来使用这个库项目了。

10.前面指定了项目关联的Git网址,但是实际上并没有上传Github上,下面的操作可以简单地在Android Studio中实现。

image

上传之后即可在Github中看到你的该项目。

题外话:

1.关于搜索顺序

下面其实是一次搜索报错,然后列出了Gradle搜索该library的顺序,感觉还是蛮有信息量的。

Could not find hujiaweibujidao.github.io:polaris:1.0.1.
Searched in the following locations:
    https://jcenter.bintray.com/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.pom
    https://jcenter.bintray.com/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.jar
    file:/Users/hujiawei/Android/android_sdk/extras/android/m2repository/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.pom
    file:/Users/hujiawei/Android/android_sdk/extras/android/m2repository/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.jar
    file:/Users/hujiawei/Android/android_sdk/extras/google/m2repository/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.pom
    file:/Users/hujiawei/Android/android_sdk/extras/google/m2repository/hujiaweibujidao/github/io/polaris/1.0.1/polaris-1.0.1.jar

从上面的输出可以看出,先是在Bintray上的对应位置找,如果没找到尝试在本地的android目录下的m2repository中找,如果还是没有找到,就在本地的google目录下的m2repository中找,如果还是没有找到,那就提示出错。

2.关于版本

有些时候同一个版本号多次执行bintrayUpload任务会报错,这个时候有两种选择,要么修改version,要么在Bintray中删除该版本。

另外,如果提示xxx.jar等文件找不到,可以先执行install任务,然后再执行bintrayUpload任务。

3.关于引用

审核通过之后,我先是使用hujiaweibujidao.github.io:polaris:1.0.0作为引用来导入,可是发现一直提示找不到!最后在Bintray中的Files中发现,pom以及jar等文件的命名是以lib4polaris-x.y.z开头的,也就是默认情况下是以我创建的Android Library Module的名称作为开始,因为上传本身也是发生在这个库项目的build.gradle中的。所以,如果改为使用hujiaweibujidao.github.io:lib4polaris:1.0.0即可引用到了。但是,如何自定义artifactId呢?这里有个对于该问题的讨论你可以试下,https://github.com/dcendents/android-maven-gradle-plugin/issues/9,其中msdx最后给出了他的方案,详情可以参考他的项目https://github.com/msdx/gradle-publish

使用bintray-release插件

该插件使得上传library到Bintray上更加简单,项目源码地址:novoda/bintray-release

参考教程:上传android library 到bintray

Hujiawei is a mobile developer Guangdong, China http://javayhu.me/ 本博客所有文章均为原创,请勿随意转载,如需转载请联系我 (hujiawei090807 AT gmail.com) 我在小专栏有个移动开发技术专栏,不定期分享移动开发的核心技术,总结移动开发的实战经验
所有文章皆为原创,内容制作精良,保证干货满满,欢迎订阅 (https://xiaozhuanlan.com/u/javayhu)
>>> 我最近在Android面试指南小专栏里面写了一篇稿子 [Android面试——算法面试心得] ,欢迎阅读!<<<
下面的二维码是我个人维护的微信公众号“潇涧技术专栏”,会不定期分享移动开发的核心技术,欢迎关注!