最近待在家无聊,开始搞一些小东西,做了一个多样式的进度加载类库(目前拥有的样式有闹钟进度加载view、肥柴进度加载view以及肥柴无进度加载view),想着没事干不如搞搞发布自己的项目到远程仓库试试。于是就有了如下踩坑经历。
发布项目到远程仓库,有几种方式(这里除去本地仓库以及建立私人仓库):JitPack、Bintary以及JCenter。
JitPack是一个网站,它允许你把git托管的java或者android项目(支持github、gitlab等),轻松发布到jitpack maven仓库上。(ps:虽然没有实践过,但是看操作简直就是傻瓜式操作与配置)。
但是为啥不用JitPack呢?
JitPack看似傻瓜式的操作和配置,有时会造成更大的麻烦。例如,git项目有配置不对,编译不过去,幸运的话,JitPack很快就能显示错误日志。但是,由于某些原因(有可能是墙的问题),JitPack迟迟不显示日志(日志那个位置一直菊花)。配置各种不透明,例如groupId、artifactId配置不灵活,version只能跟发布版本……
笔者使用的发布到JCenter方案,gradle配置用上novoda plugin插件之后极其简单,在本地编译发布时,没有JitPack的“延迟显示编译、配置错误”的缺点,有哪里配置不对,编译出问题马上就能看到。(ps:其实笔者只是不想在项目的build.gradle中需要另外设置maven地址,hhhh)。
那么如何发布项目到Bintary仓库呢?且听我娓娓道来。
进入Bintary网站:https://bintray.com/,进行账号注册,笔者直接用github关联账号注册,不多bb。
2. 创建用于发布项目的组织以及Maven仓库
在账户下方,选择创建一个组织(此处笔者创建的组织为fatdoge)。
组织的ID和组织的名称必填,其余可以选填,其中组织ID十分重要,该ID是发布项目时需要用到的配置之一,也是用于区分项目属于哪个组织的重要凭据。
创建组织后,进入该组织中,此处笔者进入的为笔者的fatdoge组织,创建一个Maven仓库,如下图,笔者通过Add New Repository创建名为maven的Maven仓库。
这里设置Maven的名称可以自定义,类型必须选择Maven。其余选项可以选择性填写。
至此,远程的Bintray上用于发布的Maven仓库已经创建完毕,只剩下如何将Android Studio中的项目发布上去。
3. 配置
上传至Bintray需要在Android Studio中对gradle进行相关配置,笔者所了解到的最为简单且容易理解的配置是利用novoda plugin插件。
Step 1
在项目的build.gradle中buildscript中添加如下脚本,使用最新的版本号,笔者在使用的时候最新的版本号为0.9.2。
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.novoda:bintray-release:0.9.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
Step 2
在需要上传的库模块的build.gradle中,添加如下脚本。
apply plugin: 'com.novoda.bintray-release'
publish {
userOrg = 'fatdoge' //bintray账户下某个组织id
repoName = 'maven' //远程仓库名
groupId = 'com.fatdoge.loadingview' //maven仓库下库的包名,一般为模块包名
artifactId = 'MultiStyleLoadingView' //项目名称
publishVersion = '1.0.1' //版本号
desc = 'A multi-style progress load view library for Android' //项目介绍,可以不写
website = 'https://github.com/HappyFatDoge/MultiStyleLoadingView' //项目主页,可以不写
licences = ['Apache-2.0']
}
这里提及的groupId、artifactId以及publishVersion,最终构成了使用时的依赖。最终的依赖构成为:implementation ‘groupId:artifactId:publishVersion’。
4. 发布
那么配置搞定了,最后的一步即为发布项目到Bintray仓库了。
首先获取上传发布需要的API Key,Bintray网站中点击用户头像->Edit Profile->API Key。
在Android Studio的Traminal面板中执行如下命令,其中BINTRAY_USERNAME替换为你的binatray用户名,BINTRAY_KEY替换为上面获取的API Key,-PdryRun=false会上传到仓库中,如果为true,只会执行gradle任务,但不会上传。
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
执行看到BUILD SUCCESSFUL就算是成功了。在对应的组织下的maven仓库下即可看到上传的类库。
5. 使用
使用时,需要告诉gradle依赖包仓库的位置,因此需要在根目录下的build.gradle中添加如下脚本。
allprojects {
repositories {
google()
jcenter()
maven { url 'https://dl.bintray.com/fatdoge/maven' }
}
}
在需要使用到的模块中的build.gradle中添加依赖。
implementation 'com.fatdoge.loadingview:MultiStyleLoadingView:1.0.0'
添加完成后编译就通过了,就可以美滋滋的使用了。Ps:上面的仓库地址和依赖可以访问我们上传成功的项目页面,可以看到相关信息。
读者可能疑问来了,笔者不是说只需要添加依赖而不需要额外设置依赖包的仓库地址吗?
因为还没发布到JCenter啊。将类库发布到Android Studio的中央仓库中就可以直接使用依赖而无需额外设置其他依赖包仓库地址啦。比如发布的为JCenter中央仓库,那么在build.gradle中设置的即为jcenter(),这个中央仓库是Android Studio默认的仓库,所以新建项目都默认添加设置了,所以也就不需要额外添加其他的依赖包仓库地址(有点强迫症的笔者表示美滋滋)。
那么如何发布到JCenter呢?(笔者内心,只隔了一天Bintray页面就变了,beta版的???找了半天才找到发布JCenter按钮在哪)。
在类库的右上角的Actions->Add to Jcenter,点击添加到JCenter,项目描述可选填。一般差不多5分钟左右便会通知是否申请成功。
最后如笔者所愿申请成功啦。
来了来了,笔者带着问题来了。
1. Lint found errors in the project
Lint 检查默认是开启的,Lint 会检查项目中的语法错误,如果没有通过则无法继续。只需要在 Module 的 build.gradle 添加如下代码。
android {
lintOptions {
abortOnError false
}
}
2. 编码问题
在 windows 下 javadoc 默认的是系统编码,Windows 就是 GBK 编码。所以一旦 java 文件中出现中文注释就会报错,提示无法映射的GBK编码(笔者建议,其实注释写英文比较好,毕竟要给所有人用嘛)。
// 指定javadoc UTF-8格式
task javadoc(type: Javadoc) {
options.encoding = "utf-8"
}
3. Javadoc出错
其意思为执行:loadingview:javadocRelease任务时出错,解决方法为用命令跳过javadocRelease任务。
What went wrong:
Execution failed for task ':loadingview:javadocRelease'.
> Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): 'D:\workspace\Android\MultiStyleLoadingView\loadingview\build\tmp\javadocRelease\javadoc.options'
在上传命令行后加 -x javadocRelease(-x意思为跳过某个任务),则整句上传命令如下。
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false -x javadocRelease
4. 类库创建失败
有的小伙伴可能会遇到执行上传命令行后出现如下问题。
“Could not create package 'cqshare/maven/testLib': HTTP/1.1 400 Bad Request [message:Please enter a valid VCS URL for your package.]
解决方法时先在该远程仓库下创建对应的package,再执行上传操作。
参考资料:
Android Studio将项目发布到Maven仓库(3种方式最新最全)
放弃JitPack,发布Android Library到Bintray、JCenter
Android 发布项目到 jcenter 遇到的坑