上一篇简单介绍了Maven仓库,里面提到了上传构件到jcenter比maven central简单一些,但是实际上操作下来,还是有一些坑的,主要是gradle不断升级和jcenter的改版,网上看到的教程跟目前的实际环境往往不一致。写这篇文章时我从零创建了一个demo项目并且成功发布到jcenter,demo项目也上传到了github (https://github.com/dfqin/jcenterDemo)。
1. JFrog Bintray 账号注册
打开JFrog Bintray 首页,点击右边红色箭头标识的入口注册,不要点击左边的按钮,左边的按钮是30天免费试用,只能把库传到bintray,不能发布到jcenter,很多人这里被坑了。
后面注册没什么特殊的,也可以直接选择第三方登录,我是直接选择的使用github登录的。登录后点击“Add New Repository”创建一个新的仓库,name这里写maven,理论上这里可以任意命名的,但是如果使用bintray-release插件上传,插件里面写死了仓库名为maven,就会因为找不到仓库名报错,很多人这里被坑到了,用其他方式上传就无所谓了。
下面我们找到自己用户名,点击小箭头会展开一个菜单,在里面选择Edit Profile,然后在新的页面找到API Key,后面我们上传库时需要使用这个值。
2. 上传库到仓库
上传仓库有多种方式,最出名的是bintray-release插件和gradle-bintray-plugin插件,第一个比较简洁,只需要配置几行脚本就好了,这里我采用的是第一种。网上例子很多采用的是第二种,需要配置很多脚本,之前我参考这篇文章使用过第二种的方法。
首先我们要有一个Android项目,这里我创建了一个demo项目上传到github了。项目有一个library Module表示用来发布的库,还有一个application 主Module用来运行和调试自己的library。在我们项目的根build.gradle里的dependencies中添加如下代码引入插件。
classpath 'com.novoda:bintray-release:0.5.0'
然后在library Module的build.gradle中添加
publish {
userOrg = 'dfqin2' // bintray 上注册的用户名
groupId = 'com.dfqin.logutil' // 包名
artifactId = 'mylog' // library名
publishVersion = '1.0.0' // 版本号
desc = 'just for demo'
website = 'https://github.com/dfqin/jcenterDemo'
}
只需要这几行配置就完成了,是不是很简洁?下面我们运行如下命令让项目编译并上传的仓库:
./gradlew clean build bintrayUpload -PbintrayUser=dfqin2 -PbintrayKey=you-api-key -PdryRun=false
其中dfqin2替换成自己前面在JFrog Bintray上注册的用户名,you-api-key使用上面的API Key替换。脚本执行完毕如果显示成功的话,就可以去网站上查看自己的库了。我遇到过两中报错,第一种是
Unable to load class 'org.gradle.api.internal.component.Usage'
后面排查是由于项目gradle使用的是3.0的版本,bintray-release的版本号太低不兼容3.0的gradle,我把bintray-release版本号提升就解决了。
第二个错误是:
HTTP/1.1 404 Not Found [message:Repo 'maven' was not found]
这个就是我前面提到的,仓库名必须为maven的原因,我的配置它默认会往dfqin2/maven/mylog上面推送,我开始创建的仓库名为mylog,路径为dfqin2/mylog/,所以脚本报错找不到maven。
3. 发布
这时候在JFrog Bintray网站上刷新,就可以看到自己上传的库,点开后在详情页面找到Add to JCenter按钮,点击后在新页面填写一下描述后发布,过一两天后审核通过就发布完成。
4. 同步到maven central
在自己的库详情页面,点击Maven Central,在弹窗里面点击"Click here to get it included"即可。