[Android]如何上传一个库到JCenter(远程依赖Android Library)

为什么要上传一个库到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中

项目截图.png

这里是个写的小项目,voice-player依赖包是我实现的一个播放网络音频支持下载音频文件而且可以生成缓存的功能库.
app中是实现了这个voice-player库的一个demo功能,已上传gitHub.可以直接下载看使用效果.
gitHub地址:https://github.com/AlexFugui/VoicePlayer
此库仅作为demo,功能尚未完备

第二步 注册bintray账号

注册链接: https://bintray.com/

1 bintray官网 点击红圈位置注册

2 注册账号或者使用GitHub/google登陆

这里注意最好使用Google邮箱登陆,它不支持163/qq等邮箱.如果你的git也是用这两种邮箱注册的,也没反应

登陆成功

登陆成功后点击add new organization
我看了教程是点add new reopsitory,然后发现没卵用,因为上传库是要添加组织id的
我创建了名叫Android组织之后打开组织


aledfugui就是我的组织id

忘记alexfugui这个id是我自己填写的还是自动生成的了.我也是慢慢摸索过来才发现这样ok没问题

然后在这个组织中add new repository


add new repository的界面

第一个默认填maven了,对应第二个的type
第二个type就是Maven
第三个选apache-2.0
第四个选填
Create以后就不用管了

edit Profile

其他教程不同,官网修改了样式,截止2020.7.14,需要点击页面右上角的用户名才能从这里进入查看API KEY
如果你看不到右上角的用户名,请刷新页面甚至重启浏览器重新登陆,我也不知道为什么

记住你的bintray用户名 和 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'//还有这一行
    }
项目根目录中gradle配置.png

然后在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
微信截图_20200715215519.png

bintray.user是你登陆bintray后右上角显示的名字
bintray.apikey是你复制的API KEY 我这个示例是错的,改成你自己的

完成后,点开Android Studio的控制台Terminal,输入如下指令:

gradlew clean
gradlew install
install 成功

待提示“BUILD SUCCESSFUL”后完成。中间会 提示一些报错,但是只要成功了就可以无视.
上面OKHttp包是我添加的动态依赖,没找到解决这个报错的方法
再执行如下命令上传文件:

gradlew bintrayUpload
上传成功

执行gradlew bintrayUpload后BUILD SUCCESSFUL就算上传成功了
然后再打开bintray
点击刚才创建的组织->maven

微信截图_20200715221401.png

可以看到已经多了一个voice-player的package,打开来看看


微信截图_20200715221621.png

网页的样式和之前搜到的教程已经变化很多了,折叠起来其他信息看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

因为我添加的时候没有截图,以下内容都是网上找的其他图片.

第一步在你上传成功的项目中->actions->add to jcenter

这里根据你的 lib 情况选择,如果不是 pom 项目,只勾选第二项即可。这里group id需要自定义填写,作为JCenter中的唯一包名标识

或者通过https://bintray.com/beta/#/bintray/jcenter添加也是一样的.

大功告成!等待jcenter审核后,就可以不添加Maven的url使用了

第六 遇到的坑

  1. 我的AS设置编码是utf-8,Library中有很多中文注释,在进行gradlew install这一步的时候会报GBK编码错误,就算我把.java文件使用其他第三方工具转码成UTF-8以后中文变成乱码再次重新写注释也是编译错误,折腾了半天最后我还是忍痛把注释都删除了.
  2. 编译错误,当时没有具体截图,但是百度以后是缺少环境变量.我先后安装了groovy环境,jre环境,gradle环境.
    我现在有的环境是:JDK12.0.2 + 使用JDK12.0.2生成的jre + groovy 3.0.4 + gradle-6.5.1
    这里可能会有java版本和bintray插件不对应的情况,具体自己百度吧
  3. gradlew install时候找不到对应的repo/name/userOrg等情况,我一个一个挨个对照,折腾了很久
  4. GBK编码错误这个问题一直没解决,导致无法添加注释很难受
    解决方法在Android Studio 修改新建项目的默认编码模式
  5. 昨晚上传的库今天居然有9个下载哈哈哈不知道谁这么相信我

已上传的Demo地址:VoicePlayer
功能还在完善中,文档待添加
第一次做开源,总想做的更完美点

参考:
快速开发与封装可集成的Android Library
Android Studio发布项目到jcenter
感谢超哥

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