放弃JitPack,发布Android Library到Bintray、JCenter

Bug:升级到gradle tools 3.1.X, gradle version 4.6+, # novoda/bintray-release有个严重bug,导致上传失败com.novoda.gradle.release.AndroidLibrary$LibraryUsage.getGlobalExcludes()Ljava/util/Set #216. 作者说用gradle version 4.4,但笔者亲测无效。作者目前还无解T_T

作者发布新库 StefMa/bintray-release,试试

什么是JitPack

JitPack是一个网站,它允许你把git托管的java或android项目(貌似目前仅支持github),轻松发布到jitpack maven仓库上。

什么是Bintray

Bintray是一个网站,它允许你创建私有maven、rpm、deb等仓库。

你还可以在Bintray上提交审核,把已经发布到bintray仓库上的库,发布到JCenter 。

为什么我不喜欢JitPack

JitPack看似傻瓜式的操作和配置,有时会造成更大的麻烦。例如,git项目有配置不对,编译不过去,幸运的话,JitPack很快就能显示错误日志。但是,由于某些原因(有可能是墙的问题),JitPack迟迟不显示日志(日志那个位置一直菊花)。配置各种不透明,例如groupId、artifactId配置不灵活,version只能跟发布版本......

只要编译错误,你必须修改代码或配置(大多数是gradle配置原因),再push到git,再在JitPack选择一个commit或release版本编译、发布......作为工程师,编译工程不能马上收到反馈,是不能容忍的。如果发布库前,能在本地编译,从console马上输出SUCCESS或FAILURE,并且能定位详细错误日志,这是最好的。

笔者用nexus搭建过私有maven(《Android Studio上传项目到Maven仓库》),gradle配置并不难。 Bintray方案,用novoda plugin后,gradle配置很简单,但注册、创建package麻烦一点点(作为程序猿,注册这点小事)。

在本地编译发布,没有JitPack的“延迟显示编译、配置错误”的缺点,有哪里配置不对,编译出问题马上就能看到。


Bintray创建maven仓库

Bintray注册

打开 bintray.com,点击右上角“Sign In”,进入注册界面。笔者建议你关联github账号,注册的细节笔者就不啰嗦了,相信你的智商。

bintray首页
bintray signin

选择maven仓库

注册好bintray账号之后,默认就有maven仓库,并不需要自己创建。当然你也可以“Add New Repository”继续创建。

maven仓库

创建Package

什么是package

你要发布一个库,必须要配置groupId、artifactId。在bintray,必须创建package,才能发布库,一个package对应一个库,这里的package并不是包名,而是与artifactId对应。

例如,gradle引用gson:

compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'

group指定的com.google.code.gson就是groupId,name指定的gson,就是artifactId。如果gson是你的项目,并且发布到bintray,就需要创建gson package.

Add New Package

在maven仓库页面,点击“Add New Package”,进入package创建界面。

Add New Package
Package创建界面

我们需要发布的库,artifactId=demo_package

  1. Name填写"demo_package";
  2. Licenses选择开源许可,可选Apache-2.0
  3. Version Control建议填github项目地址(实际上填什么都可以)

点击“Create Package”,如无意外,package创建成功!

Package Create Success

Android工程配置

新建Android工程,并新建Android Library Module,module的package=com.bintray.library.

我们使用novada plugin,帮助我们快速配置。github官网:novoda/bintray-release.

novoda目前已发布了0.5版本,由于笔者使用gradle 3.3,而novoda 0.5必须gradle 3.4+,因此笔者用0.4版本讲解。

gradle配置

在project build.gradle添加:

buildscript {
    dependencies {
        classpath 'com.novoda:bintray-release:0.4.0'
    }
}

allprojects {
    repositories {
        maven { url 'https://dl.bintray.com/kkmike999/maven' }
    }
}

// 指定javadoc UTF-8格式
task javadoc(type: Javadoc) {
    options.encoding = "utf-8"
}

https://dl.bintray.com/kkmike999/maven是bintray个人maven仓库地址,在maven页面右上角找到:

然后,在library build.gradle添加 :

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

android {
    lintOptions {
        abortOnError false
    }
}

publish {
    userOrg = 'kkmike999'      // bintray注册的用户名
    groupId = 'com.bintray.library'
    artifactId = 'demo_package'// bintray创建的package
    publishVersion = '1.0'
}

配置就大功告成了!


发布项目到Bintray

我们先去bintray找到发布需要的api key。在bintray右上角,点击Edit Profile,进入Profile界面,再选择"API KEY"页面,就可以找到API Key了:

Edit Profile
api key

在Android Studio的Terminal window,执行命令行:

./gradlew clean build bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false

(注意,windows系统,命令行前面不需要./)

bintray user 就是bintray注册用户名;
bintray api key 是 API Key.

很有可能报错:

  • What went wrong:
    Execution failed for task ':library:releaseAndroidJavadocs'.
    Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): '...\BintrayDemo\library\build\tmp\releaseAndroidJavadocs\javadoc.options'

意思是执行:library:releaseAndroidJavadocs任务时出错了,因此我们用命令跳过releaseAndroidJavadocs任务。

在命令行后加-x releaseAndroidJavadocs(-x意思是跳过某个任务),则整句命令行:

./gradlew clean build bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false -x releaseAndroidJavadocs

如果执行结果显示:

BUILD SUCCESSFUL

Total time: ... secs

发布成功了!

打开bintray demo_package页面,如果显示了版本信息,证明发布的库正常:

1.0 version

提示:发布成功后,bintray界面版本信息有一定延时,等半分钟左右,多刷新几次页面。

通过gradle任务发布

在Android Studio Gradle projects window,点击Run Gradle Task按钮,Gradle project选择整个project,Command line填入:

clean build generatePomFileForReleasePublication releaseAndroidJavadocs releaseAndroidJavadocsJar releaseAndroidSourcesJar publishReleasePublicationToMavenLocal
 bintrayUpload -PbintrayUser={bintray user} -PbintrayKey={bintray api key} -PdryRun=false
Command line

Terminal执行bintrayUpload任务,会自动执行generatePomFileForReleasePublicationreleaseAndroidJavadocsreleaseAndroidJavadocsJarreleaseAndroidSourcesJarpublishReleasePublicationToMavenLocal,但Run Gradle Task时并不会,因此要手动添加这些任务。还有,不需要跳过releaseAndroidJavadocs了,这种方式能执行成功。

执行任务后,任务会在Gradle projects保留,如果想修改执行命令和参数,可以对该任务右键->Edit Run Configuration:

Edit Run Configuration

Edit Run Configuration Detail

发布库到JCenter

这一步非常简单。

在package页面,点击"Add To JCenter",再填写开源库说明,提交审核。

等待Bintray审核通过。审核非常快,基本等一天就可以了。提交到JCenter后,引用库时,不再需要定义自己maven仓库地址。


Markdown逼格小图标

你会发现别人github readme有几个很高逼格的icon:

我们也要做这种效果! 在package页面,点击"Latest Version Badge",就会显示icon markdown代码:

download icon
[![Download](https://api.bintray.com/packages/kkmike999/maven/demo_package/images/download.svg) ](https://bintray.com/kkmike999/maven/demo_package/_latestVersion)

另外,shields.io这个网站有大量这种icon示例。


常见问题

除了上文提到的Execution failed for task ':library:releaseAndroidJavadocs'.之外,还有一些常见编译错误。

artifactId与package name不一致

:library:bintrayUpload FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':library:bintrayUpload'.
> Could not create package 'kkmike999/maven/demo': HTTP/1.1 400 Bad Request [message:Please enter a valid VCS URL for your package.]

错误中说package 'kkmike999/maven/demo',然而我们的package是kkmike999/maven /demo_package,这是publish.artifactId与在bintray创建的package name不一致造成的。

解决方法:gradle修改publish.artifactId,或在bintray重新创建package,保持artifactId与package一致。

重复提交相同版本

如果你已经发布了1.0版本到bintray,再次发布1.0,就会报这个错误:

* What went wrong:
Execution failed for task ':library:bintrayUpload'.

> Could not upload to 'https://api.bintray.com/content/kkmike999/maven/demo_package/1.0/com/bintray/library/demo_package/1.0/demo_package-1.0-sources.jar': HTTP/1.1 409 Conflict [message:Unable to upload files: An artifact with the path 'com/bintray/library/demo_package/1.0/demo_package-1.0-sources.jar' already exists]

解决方法:gradle修改publish.publishVersion,或者在bintray删除当前版本,再重新发布。

参考

《Android 发布项目到 jcenter 遇到的坑》

novoda issues


关于作者

我是键盘男。
在广州生活,悦跑圈Android工程师,猥琐文艺码农。每天谋划砍死产品经理。喜欢科学、历史,玩玩投资,偶尔旅行。

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

推荐阅读更多精彩内容