為什么要上傳一個庫到JCenter
工作好幾年,使用了很多框架,很多重復(fù)功能的代碼越來越多,不好管理體積也大.最后變成了帶著個U盤換工作.
剛工作的時候使用lib文件下的jar包,下載困難資源難找,不少朋友都為了這個給CSDN貢獻了不少金幣吧.
后來用各種本地依賴包,雖說方便修改但是有些功能單一的功能每次都要重復(fù)修改比較麻煩.
再后來使用了各種api/compile的遠(yuǎn)程依賴包,相當(dāng)方便.
能上傳一個自己的庫,是我一直想做的事.
ps:引入方式的介紹:
android gradle依賴:implementation 和compile的區(qū)別
依賴引入 | Android依賴引入史上最全攻略
添加了大神jessyan的配置,感謝yan神
Android 大神jessyan的bintray配置 和本文配合食用效果更佳
正文
話不多說,教程開始.
本文是2020年7月15日寫的,教程以7月10日-7月14日的各平臺版本為準(zhǔn).
其中用到https://github.com , https://bintray.com , https://www.google.com等網(wǎng)站,不能正常訪問的自己想辦法.
第一步 準(zhǔn)備項目
保證你有個一個demo項目,你想要上傳的功能集中在一個Android Library中
這里是個寫的小項目,voice-player依賴包是我實現(xiàn)的一個播放網(wǎng)絡(luò)音頻支持下載音頻文件而且可以生成緩存的功能庫.
app中是實現(xiàn)了這個voice-player庫的一個demo功能,已上傳gitHub.可以直接下載看使用效果.
gitHub地址:https://github.com/AlexFugui/VoicePlayer
此庫僅作為demo,功能尚未完備
第二步 注冊bintray賬號
注冊鏈接: https://bintray.com/
這里注意最好使用Google郵箱登陸,它不支持163/qq等郵箱.如果你的git也是用這兩種郵箱注冊的,也沒反應(yīng)
登陸成功后點擊add new organization
我看了教程是點add new reopsitory,然后發(fā)現(xiàn)沒卵用,因為上傳庫是要添加組織id的
我創(chuàng)建了名叫Android組織之后打開組織
忘記alexfugui這個id是我自己填寫的還是自動生成的了.我也是慢慢摸索過來才發(fā)現(xiàn)這樣ok沒問題
然后在這個組織中add new repository
第一個默認(rèn)填maven了,對應(yīng)第二個的type
第二個type就是Maven
第三個選apache-2.0
第四個選填
Create以后就不用管了
其他教程不同,官網(wǎng)修改了樣式,截止2020.7.14,需要點擊頁面右上角的用戶名才能從這里進入查看API KEY
如果你看不到右上角的用戶名,請刷新頁面甚至重啟瀏覽器重新登陸,我也不知道為什么
用戶名是alexfugui117
API KEY自行復(fù)制記下來
第三步 配置項目
首先在項目根目錄下的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"http://包名,可以自定義,寫aa.bb.cc都可以
//項目引用的版本號,比如implementation 'com.davis.ui.pulltorefresh:pulltorefresh:2.1.0'中的2.1.0就是這里配置的。
version = "1.0.0"http://發(fā)布aar的庫版本
install {
repositories.mavenInstaller {
// 生成pom.xml和參數(shù)
pom {
project {
packaging 'aar'
// 項目描述,復(fù)制我的話,這里需要修改。
name 'voice-player'// 可選,項目名稱。
description 'Android voice-player'// 可選,項目描述。
url siteUrl // 項目主頁,這里是引用上面定義好。
// 軟件開源協(xié)議,現(xiàn)在一般都是Apache License2.0吧,復(fù)制我的,這里不需要修改。
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//填寫開發(fā)者基本信息,復(fù)制我的,這里需要修改。
developers {
developer {
id 'AlexFugui' // 開發(fā)者的id,隨便寫
name 'AlexFugui' // 開發(fā)者名字,,隨便寫
email 'xxxxxxxx@xx.com' // 開發(fā)者郵箱。
}
}
// SCM,直接復(fù)制,這里不需要修改。
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你的注釋寫的不規(guī)范就編譯不過。
}
// 生成javaDoc的jar,不需要修改。
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
// 這里是讀取Bintray相關(guān)的信息,我們上傳項目到github上的時候會把gradle文件傳上去,所以不要把帳號密碼的信息直接寫在這里,寫在local.properties中,這里動態(tài)讀取。
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網(wǎng)站上先添加
name = "voice-player"
// 發(fā)布到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 // 是否是公開項目。
}
}
第四步 準(zhǔn)備上傳
在local.properties文件添加如下代碼:
bintray.user=qweasdzxc
bintray.apikey=02085y42a45984ca90878ab075483c611a9b3d5
bintray.user是你登陸bintray后右上角顯示的名字
bintray.apikey是你復(fù)制的API KEY 我這個示例是錯的,改成你自己的
完成后,點開Android Studio的控制臺Terminal,輸入如下指令:
gradlew clean
gradlew install
待提示“BUILD SUCCESSFUL”后完成。中間會 提示一些報錯,但是只要成功了就可以無視.
上面OKHttp包是我添加的動態(tài)依賴,沒找到解決這個報錯的方法
再執(zhí)行如下命令上傳文件:
gradlew bintrayUpload
執(zhí)行gradlew bintrayUpload
后BUILD SUCCESSFUL就算上傳成功了
然后再打開bintray
點擊剛才創(chuàng)建的組織->maven
可以看到已經(jīng)多了一個voice-player的package,打開來看看
網(wǎng)頁的樣式和之前搜到的教程已經(jīng)變化很多了,折疊起來其他信息看Maven Info,點擊gradle,可以看到你熟悉的鏈接已經(jīng)生成了.但是現(xiàn)在還不能用.你需要添加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以后,大功告成.
你以為這就完事了?你還沒添加到j(luò)center呢.
第五步 添加到JCenter
因為我添加的時候沒有截圖,以下內(nèi)容都是網(wǎng)上找的其他圖片.
或者通過https://bintray.com/beta/#/bintray/jcenter添加也是一樣的.
大功告成!等待jcenter審核后,就可以不添加Maven的url使用了
第六 遇到的坑
- 我的AS設(shè)置編碼是utf-8,Library中有很多中文注釋,在進行
gradlew install
這一步的時候會報GBK編碼錯誤,就算我把.java文件使用其他第三方工具轉(zhuǎn)碼成UTF-8以后中文變成亂碼再次重新寫注釋也是編譯錯誤,折騰了半天最后我還是忍痛把注釋都刪除了. - 編譯錯誤,當(dāng)時沒有具體截圖,但是百度以后是缺少環(huán)境變量.我先后安裝了groovy環(huán)境,jre環(huán)境,gradle環(huán)境.
我現(xiàn)在有的環(huán)境是:JDK12.0.2 + 使用JDK12.0.2生成的jre + groovy 3.0.4 + gradle-6.5.1
這里可能會有java版本和bintray插件不對應(yīng)的情況,具體自己百度吧 -
gradlew install
時候找不到對應(yīng)的repo/name/userOrg等情況,我一個一個挨個對照,折騰了很久 - GBK編碼錯誤這個問題一直沒解決,導(dǎo)致無法添加注釋很難受
解決方法在Android Studio 修改新建項目的默認(rèn)編碼模式 - 昨晚上傳的庫今天居然有9個下載哈哈哈不知道誰這么相信我
已上傳的Demo地址:VoicePlayer
功能還在完善中,文檔待添加
第一次做開源,總想做的更完美點
參考:
快速開發(fā)與封裝可集成的Android Library
Android Studio發(fā)布項目到j(luò)center
感謝超哥