为什么要上传一个库到JCenter
工作好几年,使用了很多框架,很多重复功能的代码越来越多,不好管理体积也大.最后变成了带着个U盘换工作.
刚工作的时候使用lib文件下的jar包,下载困难资源难找,不少朋友都为了这个给CSDN贡献了不少金币吧.
后来用各种本地依赖包,虽说方便修改但是有些功能单一的功能每次都要重复修改比较麻烦.
再后来使用了各种api/compile的远程依赖包,相当方便.
能上传一个自己的库,是我一直想做的事.
ps:引入方式的介绍:
android gradle依赖:implementation 和compile的区别
依赖引入 | Android依赖引入史上最全攻略
添加了大神jessyan的配置,感谢yan神
Android 大神jessyan的bintray配置 和本文配合食用效果更佳
正文
话不多说,教程开始.
本文是2020年7月15日写的,教程以7月10日-7月14日的各平台版本为准.
其中用到https://github.com , https://bintray.com , https://www.google.com等网站,不能正常访问的自己想办法.
第一步 准备项目
保证你有个一个demo项目,你想要上传的功能集中在一个Android Library中
这里是个写的小项目,voice-player依赖包是我实现的一个播放网络音频支持下载音频文件而且可以生成缓存的功能库.
app中是实现了这个voice-player库的一个demo功能,已上传gitHub.可以直接下载看使用效果.
gitHub地址:https://github.com/AlexFugui/VoicePlayer
此库仅作为demo,功能尚未完备
第二步 注册bintray账号
注册链接: https://bintray.com/
这里注意最好使用Google邮箱登陆,它不支持163/qq等邮箱.如果你的git也是用这两种邮箱注册的,也没反应
登陆成功后点击add new organization
我看了教程是点add new reopsitory,然后发现没卵用,因为上传库是要添加组织id的
我创建了名叫Android组织之后打开组织
忘记alexfugui这个id是我自己填写的还是自动生成的了.我也是慢慢摸索过来才发现这样ok没问题
然后在这个组织中add new repository
第一个默认填maven了,对应第二个的type
第二个type就是Maven
第三个选apache-2.0
第四个选填
Create以后就不用管了
其他教程不同,官网修改了样式,截止2020.7.14,需要点击页面右上角的用户名才能从这里进入查看API KEY
如果你看不到右上角的用户名,请刷新页面甚至重启浏览器重新登陆,我也不知道为什么
用户名是alexfugui117
API KEY自行复制记下来
第三步 配置项目
首先在项目根目录下的build.gradle文件中添加
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'//添加这一行
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'//还有这一行
}
然后在Library的build.gradle中添加以下代码
/**************************************************下面是上传jcenter的配置**************************************************/
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
def siteUrl = 'https://github.com/AlexFugui/VoicePlayer' //项目在github主页地址
def gitUrl = 'https://github.com/AlexFugui/VoicePlayer.git' //Git仓库的地址
// 唯一包名,比如implementation 'com.davis.ui.pulltorefresh:pulltorefresh:2.1.0'中的com.davis.ui.pulltorefresh就是这里配置的。
group = "com.alex.voice-player"//包名,可以自定义,写aa.bb.cc都可以
//项目引用的版本号,比如implementation 'com.davis.ui.pulltorefresh:pulltorefresh:2.1.0'中的2.1.0就是这里配置的。
version = "1.0.0"//发布aar的库版本
install {
repositories.mavenInstaller {
// 生成pom.xml和参数
pom {
project {
packaging 'aar'
// 项目描述,复制我的话,这里需要修改。
name 'voice-player'// 可选,项目名称。
description 'Android voice-player'// 可选,项目描述。
url siteUrl // 项目主页,这里是引用上面定义好。
// 软件开源协议,现在一般都是Apache License2.0吧,复制我的,这里不需要修改。
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//填写开发者基本信息,复制我的,这里需要修改。
developers {
developer {
id 'AlexFugui' // 开发者的id,随便写
name 'AlexFugui' // 开发者名字,,随便写
email 'xxxxxxxx@xx.com' // 开发者邮箱。
}
}
// SCM,直接复制,这里不需要修改。
scm {
connection gitUrl // Git仓库地址。
developerConnection gitUrl // Git仓库地址。
url siteUrl // 项目主页。
}
}
}
}
}
// 生成jar包的task,不需要修改。
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
// 生成jarDoc的task,不需要修改。
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
// destinationDir = file("../javadoc/")
failOnError false // 忽略注释语法错误,如果用jdk1.8你的注释写的不规范就编译不过。
}
// 生成javaDoc的jar,不需要修改。
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// 这里是读取Bintray相关的信息,我们上传项目到github上的时候会把gradle文件传上去,所以不要把帐号密码的信息直接写在这里,写在local.properties中,这里动态读取。
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user") // Bintray的用户名。
key = properties.getProperty("bintray.apikey") // Bintray刚才保存的ApiKey。
configurations = ['archives']
pkg {
repo = "maven" //Repository名字 需要自己在bintray网站上先添加
name = "voice-player"
// 发布到Bintray上的项目名字,这里的名字不是implementation 'com.davis.ui.pulltorefresh:pulltorefresh:2.1.0'中的pulltorefresh。
userOrg = 'alexfugui'//Bintray的组织中,你的id
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true // 是否是公开项目。
}
}
第四步 准备上传
在local.properties文件添加如下代码:
bintray.user=qweasdzxc
bintray.apikey=02085y42a45984ca90878ab075483c611a9b3d5
bintray.user是你登陆bintray后右上角显示的名字
bintray.apikey是你复制的API KEY 我这个示例是错的,改成你自己的
完成后,点开Android Studio的控制台Terminal,输入如下指令:
gradlew clean
gradlew install
待提示“BUILD SUCCESSFUL”后完成。中间会 提示一些报错,但是只要成功了就可以无视.
上面OKHttp包是我添加的动态依赖,没找到解决这个报错的方法
再执行如下命令上传文件:
gradlew bintrayUpload
执行gradlew bintrayUpload
后BUILD SUCCESSFUL就算上传成功了
然后再打开bintray
点击刚才创建的组织->maven
可以看到已经多了一个voice-player的package,打开来看看
网页的样式和之前搜到的教程已经变化很多了,折叠起来其他信息看Maven Info,点击gradle,可以看到你熟悉的链接已经生成了.但是现在还不能用.你需要添加Maven库支持
在项目根目录build.gradle中添加
repositories {
google()
jcenter()
maven { url('https://dl.bintray.com/alexfugui/maven') }//这个连接是上图右上角的链接
}
在APP的build.gradle中的
implementation project(path: ':voice-player')
替换成implementation 'com.alex.voice:voice-player:1.0.0'
sync以后,大功告成.
你以为这就完事了?你还没添加到jcenter呢.
第五步 添加到JCenter
因为我添加的时候没有截图,以下内容都是网上找的其他图片.
或者通过https://bintray.com/beta/#/bintray/jcenter添加也是一样的.
大功告成!等待jcenter审核后,就可以不添加Maven的url使用了
第六 遇到的坑
- 我的AS设置编码是utf-8,Library中有很多中文注释,在进行
gradlew install
这一步的时候会报GBK编码错误,就算我把.java文件使用其他第三方工具转码成UTF-8以后中文变成乱码再次重新写注释也是编译错误,折腾了半天最后我还是忍痛把注释都删除了. - 编译错误,当时没有具体截图,但是百度以后是缺少环境变量.我先后安装了groovy环境,jre环境,gradle环境.
我现在有的环境是:JDK12.0.2 + 使用JDK12.0.2生成的jre + groovy 3.0.4 + gradle-6.5.1
这里可能会有java版本和bintray插件不对应的情况,具体自己百度吧 -
gradlew install
时候找不到对应的repo/name/userOrg等情况,我一个一个挨个对照,折腾了很久 - GBK编码错误这个问题一直没解决,导致无法添加注释很难受
解决方法在Android Studio 修改新建项目的默认编码模式 - 昨晚上传的库今天居然有9个下载哈哈哈不知道谁这么相信我
已上传的Demo地址:VoicePlayer
功能还在完善中,文档待添加
第一次做开源,总想做的更完美点
参考:
快速开发与封装可集成的Android Library
Android Studio发布项目到jcenter
感谢超哥