使用Gradle发布Library到JCenter

由于本篇文章的排版问题,不利于阅读,请看排版后的文章:传送门


引言

使用Android Studio开发的童鞋,相信都使用过远程依赖吧!啥?远程依赖都不懂?

dependencies {

    compile'com.android.support:support-v4:22.2.1'

}

在Module的build.gradle中总看过这样的代码吧,如果你是没有,那么我只能说哥们儿,你是猴子请来的。

上面的引用方式,就可以让我们在工程中使用support-v4包的内容了,等同于当初在Eclipse开发时代引用support-v4包,是不是感觉这样非常酷,一句话就可以导包了。作为程序员,知其然知其所以然是很有必要的,因此我也试着探索,并且发布了自己的远程依赖库,接下来就一起了解这个过程。

注:网上有很多类似文章,有些实现的形式不一样,但原理终究是一致的,充其量只是穿的马甲不同而已。


一、简介

注:大牛可以忽略这一段,其实也可以忽略整篇文章。

为什么上面使用那行代码之后就可以使用对应的library了,不知道有没有童靴像我最开始那样感到奇怪。其实这个也不是那么神奇,Android Studio根据Module中build.gradle中的定义(也就是类似上面的定义)从Maven仓库服务器上下载了Library到本地,然后提供给工程使用的(不下载到本地,断网了怎么破..你说是不。)。

Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。有两个比较标准的Android Library文件服务器:jcenter和maven central。这两个又是啥鬼?我们接着来。

其实这种概念上的,我也不是特别懂,就粗略的过一下。

jcenter是一个由bintray.com维护的Maven仓库。

我们在项目的build.gradle文件中如下定义仓库,就能使用jcenter了:

allprojects {

  repositories {

    jcenter()   //关键点是这句

    }

}

Maven Central则是由sonatype.org维护的Maven仓库。

我们在项目的build.gradle文件中如下定义仓库,就能使用Maven Central了:

allprojects {

    repositories {

        mavenCentral()  //关键点是这句

    }

}

注:从上面可以知道,不管是jcenter还是Maven Central,两者都是Maven仓库。

所以我们发布Library可以选择发布到上面说的两个Maven仓库中,由于诸多原因,本文只关注发布到jcenter仓库中。

粗暴直接的原因就是jcenter发布更简单,并且android stduio创建的项目默认也是配置的jcenter,当然还有so on...

二、gradle如何从仓库上获取library

知道gradle如何从仓库获取library的规则,才知道如何在上传的时候满足规则。

我们知道在项目中配置compile 'com.android.support:support-v4:22.2.1'之后就可以使用support-v4包。

这句话包含两部分,compile是编译的意思,这个不是我们关注的重点,我们关注后面那个值。

com.android.support:support-v4:22.2.1这句话包含了三个信息点,通过冒号分割,这个格式就是GROUP_ID:ARTIFACT_ID:VERSION。

GROUP_ID定义了library的group,group你可以简单理解为分组一样,每个library是属于一个组的,就好比一个文件要保存在一个文件夹中。所以library的GROUP_ID 是可以相同的,都是为了方便管理,比如v4跟v7的关系,都从属于com.android.support。

ARTIFACT_ID就是library的真是名字

VERSION就是版本号,建议的形式为x.y.z

gradle就会通过上面这个格式组装出对应的url,然后下载文件,这个url大致可能是http://jcenter.bintray.com/com/android/support/support-v4/22.2.1(仅供参考)

三、发布Library


这个过程,简单粗暴点来讲,就是我们要把我们的工程发布到jcenter代码仓库,所以有些步骤就是显而易见的,我们一步一步来讲。

1、注册bintray账号

  bintray又是啥鬼?能吃吗?额...前面已经说了,jcenter是由bintray.com维护的Maven仓库,你要用人家的文件服务器,让你注册个账号,这不是理所应当嘛。

注册过程很简单,这个不用手把手教吧,注意一点就是你可能打不开这个网站,因为你要感谢“国家给你的保护”。

2、获取Api Key

   注册之后,

点击右上角,点击“Your Profile”


接着点Edit


左侧菜单,点击“API Key”,接着会让你输入你的密码,输入之后,


点击“Show”即可查看API Key的内容,记住它。

3、创建自己的工程

由于我们上传的通常都是一个Library,所以你最好是单独创建一个Library Module,把这个工程打包上传到代码仓库,怎么创建Library Module这个没啥技术含量吧。

4、配置工程

这一步非常关键,也有很多小步骤,注意仔细。

a.配置工程的local.properties

bintray.user=YOUR_BINTRAY_USERNAME    //记住,是bintray账号名,不是bintray账号

bintray.apikey=YOUR_BINTRAY_API_KEY     //第二步获取的那串字符

b.配置工程的build.gradle

buildscript {

   ...

    dependencies {

        ...

       //下面两个包是用于上传的插件

        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'    //关键

        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'  //关键

         ...

    }

}

c.配置Library Module的build.gradle

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

apply plugin:'com.jfrog.bintray'

group="xxxx" //上面介绍的GROUP_ID

version="xxxx" //上面介绍的VERSION

install{

    repositories.mavenInstaller {

    // 生成pom文件

    pom {

        project {

            packaging 'aar'

            description 'xxxx'  //描述,可不设置此属性

             name 'xxx' //名字

             url 'xxxx'     //项目主页地址,如果没有,通常可以使用github项目的地址

            // 设置协议证书,通常就是Apache 2.0开源协议

             licenses {

                   license {

                       name 'The Apache Software License, Version 2.0'

                       url 'http://www.apache.org/licenses/LICENSE-2.0.txt'

                       distribution 'xxxx' //描述,可不设置此属性

                    }

             }

             //开发者信息

             developers {

                  developer {

                      id 'xxxxx' //id 这里具体填什么我都不知道,随便填了自己的常用名,这些信息最后都会写入pom文件

                      name 'xxxxx' //名字

                      email 'xxxx' //邮箱

                  }

             }

            //配置相关项目链接

             scm {

                    connection 'xxxx' //我使用的是项目在github上生成的git地址

                    developerConnection 'xxxx'//我使用的是项目在github上生成的git地址

                    url 'xxxx'//项目地址  我使用的项目在github上的地址

              }

         }

     }

}

}

//生成对应的source.jar

task sourcesJar(type: Jar) {

    classifier='sources'

}

//生成java doc文件

task javadoc(type: Javadoc) {

    source=android.sourceSets.main.java.srcDirs

    classpath+=project.files(android.getBootClasspath().join(File.pathSeparator))

    failOnError=false

}

//生成对应的javadoc.jar

task javadocJar(type: Jar,dependsOn: javadoc) {

classifier='javadoc'

from javadoc.destinationDir

}

artifacts{

    archives javadocJar

    archives sourcesJar

}

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="xxxx" //在bintray上的项目名字

        websiteUrl="xxx" //项目地址  我使用的github项目地址

        vcsUrl="xxx" //项目管理地址  我使用的github上对应的git地址

        licenses=["Apache-2.0"]

        publish=true

    }

}

}

5、发布Library

1、在Android Studio执行gradlew install命令

如果终端最终输出BUILD SUCCESSFUL,则说明所有本地文件都生成成功了。

2、在Android Studio执行gradlew bintrayUpload命令

如果终端最终输出BUILD SUCCESSFUL,则说明发布成功,这个时候你登陆bintray,应该能够看到刚才发布成功的工程。

四、发布到Jcenter

如果上述步骤SUCCESSFUL了,那么恭喜你,你的library已经发布到互联网了,任何人都可以使用了,不过library只是发布到了你个人的Maven仓库中,而不是jcenter上,如果这个时候要使用你的library,则他必须在工程的build.gradle中配置仓库地址:

repositories {

maven {

url 'https://dl.bintray.com/xxx/maven/'

}

想要不用去定义url的话,那么只需要把library发布到jcenter即可,发布非常简单,点击项目,进入项目详情界面


点击‘add to jcenter’,然后提交到bintray团队审核,需要等待一定时间,快的话两三个小时,审核通过之后,任何人就可以不用定义地址而使用你的library了。

五、可能遇到的坑

发布过程中可能会遇到一些问题,我也是反反复复弄了几次,才发布成功。接下来我们看看可能遇到哪些问题

1、编码GBK的不可映射字符

这是因为javadoc生成的时候使用GBK编码,而项目使用的UTF-8编码。

解决办法:library的buil.gradle文件的根节点中添加如下代码

javadoc {

    options{

        encoding "UTF-8"

        charSet 'UTF-8'

        author true

        version true

        links "http://docs.oracle.com/javase/7/docs/api"

    }

}

2、HTTP/1.1 401 Unauthorized [message:This resource requires authentication]

通常是因为bintray的用户名和API Key配置错误了,注意检查,是bintray用户名而不是bintray登陆账号,最初我就写成自己的账号去了。

3、HTTP/1.1 409 Conflict

该版本已经存在,需要在 bintray 管理界面上删除该版本后才可以再次上传

4、java.net.SocketException: Software caused connection abort: socket write error

bintray服务器被GFW墙了,你需要翻墙。

5、忘记关键字了

这个问题已经记不起错误的关键字了,因为有很多文章都介绍了如何上传Library到jCenter,但是有些文章有些日子了,

classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'   

classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'  

这两句他们写的可能是1.2,反正就是比1.3小,Android Studio 的2.x之后,gradle版本很高的话,这个必须配置在1.3以上,bintray的plugin也是,反正这里有点模糊了,大致就是因为这个的版本导致的问题。

如果本文有帮助到你,请点赞,That's all, thanks!


PS:由于上面配置较多,可以把配置Library工程的build.gradle里面的内容独立出来,然后在Module的build.gradle中使用apply 命令,这样可以让Library工程的配置清晰一点,详细的所有配置可以见我github上的配置https://github.com/SupLuo/BintrayDeploy

网上有很多这样的介绍,其实本质的原理是一模一样的。甚至有人还提出了使用apply 远程文件的方式,也就是把配置部分的代码放在互联网上(比如github上)然后apply 加上对应地址即可,详细可见https://github.com/SupLuo/android-library-publish-to-jcenter

还是那句话,原理一致。这种方式其实对于一个module的情况比较不错,但是对于一个项目中有多个module一起管理的,就不是很适合,我比较倾向于使用我github上BintrayDeploy描述的项目结构处理,每个module中创建一个配置文件,配置文件中共用一些常量,然后apply配置文件,详细可见https://github.com/SupLuo/MS 这个项目,里面有四个module,分别以ms开头,每个module都包含一个bintray.gradle配置文件,每次需要发布bintray的时候,只需要更改下对应文件的版本号,然后在module的build.gradle的文件末尾添加apply from:'./bintray.gradle'发布即可。


最近发布JCenter有点变化,详见:http://www.qingpingshan.com/rjbc/az/179250.html
http://www.w2bc.com/article/196530

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,724评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,104评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,142评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,086评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,076评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,914评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,220评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,871评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,318评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,834评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,951评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,574评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,162评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,162评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,383评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,349评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,652评论 2 343

推荐阅读更多精彩内容