前言
jcenter 作为 Android 开发者来说,应该是首选,因为 Android Studio 默认即是以 jcenter 为远程库,本文使用 bintray-release
插件完成项目的上传,相比于网上流传的 gradle-bintray-plugin
, bintray-release
所需要编写的 gradle 代码量极少,所以即使你是一个与我一样对 gradle 不熟悉的开发人员,那也不是很大问题。其 github 地址为:https://github.com/novoda/bintray-release,有任何 issues 都可以在上面提交。
先完成你的 library
网上的教程都是先完成账号注册再跳转叫你完成 library,然后再回来上传,千万别这样,一来一回很容易迷糊,既然你是想要上传你的 library 的话,那么我相信这一步你已经完成了。
project 下 build.gradle
标题已经写的很大了,希望各位读者不要搞混了,这是在 project 目录下的 build.gradle
文件下添加以下依赖:
buildscript {
repositories {
jcenter()
}
dependencies {
// 请添加如下一行依赖
classpath 'com.novoda:bintray-release:0.5.0'
}
}
目前笔者所使用的是 0.5.0 版本的 bintray-release
,bintray-release
插件版本可点此链接查看, https://github.com/novoda/bintray-release/releases。就目前笔者所使用的 0.5.0 版本来说,需要使用 gradle 3.5 version+ 进行编译,所以其他版本很有可能也对 gradle 版本有一定要求,希望各位读者稍稍注意些,不过不要紧,因为如果你的 gradle 版本不合适,在后期编译的结果中会给予你相应的提示。在 project 下的 build.gradle
中添加了相应依赖之后,我们就可以在 project 中各个 module 中使用。
module 下 build.gradle
请在你的 module 下的 build.gradle 中添加如下依赖:
apply plugin: 'com.novoda.bintray-release'
publish {
userOrg = 'username' // bintray 用户名
groupId = 'com.username' // 依赖前面的路径,例如:compile 'com.squareup.okhttp3:okhttp:3.8.1',这里所填的就是 com.squareup,建议使用 com.+你的用户名
artifactId = 'projectname' // 模块名称
publishVersion = '1.0.0' // 版本号
desc = 'xxxxxx' // 你的项目描述
website = 'xxx' // 你的项目地址,可填 github 地址
}
如上已经写的很清楚了,这里还要提出一点的就是上面说到的模块名称,如果你的 library 只有一个,那么没有任何问题,直接写成你想设计成的名字。但是你的 library 如果是多 module 组成的话,例如可参考我的项目Permissions4M,各个模块请单独给一个名字用以区分,我的建议是 项目名-模块功能
,例如我的参考库中分成了三个 module,分别取了 permissions4m-api
, permissions-annotation
, permissions-processor
用以区分。如果还有什么疑问,可以留言给笔者。如此一来,关于项目的配置我们已经做好了,那么接下来我们就应该去把关于 jcenter 网站的东西给完成就好了。两个 gradle 文件写好后,别忘了点击 sync 进行同步。
注册 bintray 账号
官网链接:https://bintray.com/,请一定注意:
- 不要使用此链接注册:
https://bintray.com/signup - 务必使用此链接注册:https://bintray.com/signup/oss
如果你是进入官网的话,请点击右侧红色框框注册而不是左侧:
简单的说下,左侧注册是为付费用户免费体验,但是这个账户注册了之后反而有相当多的限制,致命的一点就是你无法将你的库上传至 jcenter 作为一个公有库供大家使用,而右侧的注册正如上所说“for an open source account”。账号注册好了之后,请进入:https://bintray.com/profile/edit ——
请点击 API Key,接下来
请点击箭头所指按钮,对 API Key 进行复制,当然如果你想点击 Show 看一看自己的 key 我也不拦着你。你可能会有一个疑问 API Key 是什么?理解起来很简单,既然 square 公司发布了 okhttp3 的 3.8.1
版本,那么我可不可以在前面所提到的 module 中的 gradle 中把 groupId 改成 okhttp3 的 groupId,然后上传新的版本覆盖它呢?当然不可以,一点是 groupId 是唯一的,另一点就是如果你想上传 square 公司的 okhttp3 项目的话,一定要有它的 API Key,所以 API Key 就类似一个账号密码的功能,来保障开发者项目的唯一性。
创建 maven 仓库
就像使用 github 一样,我们在 bintray 上需要先行创建一个库,但是一个账号只需要创建一个库就可以了。如下所示:
点击 Add New Repository:
请务必将 Name 写成 maven,因为这样可以帮你省去很多麻烦,然后 Type 务必选择 Maven。创建好 repo 后,请进入 repo 中,然后:
请点击 Add New Package,这里请注意,以后如果你有新的 library 需要上传到 jcenter,你不需要新建新的 repo,只需要进入 Maven repo 后,点击 Add New Package 即可,接下来就是填入相应的信息并确认即可。
Terminal 输入命令并上传
你可以选择原生或 Android Studio 中 Terminal 输入以下命令:
Windows:
gradlew clean build bintrayUpload -PbintrayUser=你的用户名 -PbintrayKey=API Key 的值 -PdryRun=false
Mac OS:
./gradlew clean build bintrayUpload -PbintrayUser=你的用户名 -PbintrayKey=API Key 的值 -PdryRun=false
如果出现 BUILDSUCCESSFUL
则代表已经成功,但是如果出现 FAILED
请不要慌,看看 terminal 的最前面的输出部分,看看是否有异常,如果没有或者不知道怎么解决,那么根据 terminal 最后面的输出部分,添加相应的参数让 terminal 输出异常细节,在此由于笔者没有截图保留,所以就不提供给各位读者了。大部分情况下的出错常常是 401,这在很大程度上可能是你的 API Key 填错了,如果还有解决不了的异常,可自行百度和谷歌,也可留言给笔者,但务必请先自行查询。
add to jcenter
理想情况下你的库已经上传到 bintray 上了,但是此时你的库还不是公有的,需要手动将库从你目前的私人 repo 同步到 jcenter 中,打开你的 repo 并进入你的项目中,在如下的位置会有一个 add to jcenter 的按钮:
由于笔者已经同步到 jcenter,故不再出现该按钮,而是多了一个方框中的咖啡杯,代表已经同步到了 jcenter。在点击 add to jcenter 之后,就会进入一个提交页面,你可以在框框内填上一些描述你库功能的文字,然后就可以提交了:
由于美国和我们有一定的时差,所以你的库可能不会很及时的被审核提交通过,但是就笔者的经历来看,都会在美国当地工作日当天处理好,速度还是很快的。
题外话
说几句题外话——
其一是关于更新版本:
只需要将上述中 module 中的 build.gradle 中的
publishVersion
进行更改就好了,如果你和笔者一样不是选择上传新版本,而是不停地覆盖老版本,那么请先在 bintray 上手动删除老版本之后再进行版本覆盖,当然,覆盖版本这种事只能发生在项目测试期,而项目运行期肯定不能这么干。jcenter 同步你的库所需时间大小不一,但是请读者记住,版本更新是不需要 add to jcenter 的,也就是意味着不需要通过审核,只是同步会需要一定时间,时间长短不一,可能几分钟,也可能如笔者一样,等待了几天才完成同步。其二是关于上述所说的版本覆盖:
gradle 在每次依赖的情况下,实际上都会对库进行本地缓存,这样当我们下次再次使用该项目的同一版本的时候就会直接在本地进行获取而并不需要远程获取,这样是很大程度上方便了开发者,但是对于我上述的版本覆盖问题来说却是致命的。我在本地导入 1.0.0 版本测试的时候发现这个版本有个致命的 bug,导致项目压根就不能正常运行,我选择了上 bintray 手动删除 1.0.0 版本,并在本地修复 bug 后上传了新的 1.0.0 版本,但是我此时再次在本地使用 gradle 进行远程依赖时,gradle 会发现,这个库刚刚用过,而且还是 1.0.0 版本,那我就不去远程获取了,因为本地我缓存了一份啊!那么这样就会导致我们的 gradle 不能刷新本地依赖,怎么解决呢?请见我的上一篇博客,一行命令带你强制清除 gradle 依赖缓存