我在 JCenter 上發(fā)布過 Java、Android嚣州、Kotlin 的項(xiàng)目已經(jīng)有數(shù)十個(gè)了鲫售。踩坑無數(shù),所以寫下這篇文章避诽,作為記錄和總結(jié)龟虎。
JCenter是什么?
它是由 JFrog 公司提供的 Bintray 中的 Java 倉庫沙庐。它是當(dāng)前世界上最大的 Java 和 Android 開源軟件構(gòu)件倉庫鲤妥。 所有內(nèi)容都通過內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)使用加密https連接獲取。JCenter是Goovy Grape內(nèi)的默認(rèn)倉庫拱雏,Gradle內(nèi)建支持(jcenter()倉庫)棉安,非常易于在(可能除了Maven之外的)其他構(gòu)建工具內(nèi)進(jìn)行配置。
與 Maven Central 相比铸抑,JCenter 的速度更快贡耽,包含的庫更多,UI界面更友好鹊汛,更容易使用蒲赂,同時(shí) Bintray 還支持將 JCenter 上傳到 Maven Central 的功能。
越來越多的Java刁憋、Android開發(fā)者已經(jīng)從 Eclipse 平臺(tái)轉(zhuǎn)移到 Intellij 和 Android Studio滥嘴。其中,Android Studio 默認(rèn)使用gradle作為構(gòu)建工具至耻。用來導(dǎo)入第三方的庫非常方便若皱,只需要一句話就可以搞定整個(gè)包的導(dǎo)入過程。而且 JCenter 是 Android Studio 默認(rèn)使用的服務(wù)器倉庫尘颓。
compile 'com.safframework.log:saf-log:1.0.4'
Bintray的注冊(cè)
個(gè)人注冊(cè) Bintray 地址:https://bintray.com/signup/oss
不要去 https://bintray.com/login 注冊(cè)走触,這個(gè)千萬不能搞錯(cuò)。國內(nèi)用戶可以使用github的賬號(hào)進(jìn)行登陸完成注冊(cè)疤苹。
注冊(cè)完之后互广,需要注意這個(gè)API Key一定要保存好,因?yàn)閷㈨?xiàng)目發(fā)布到JCenter時(shí)會(huì)用到它痰催。
注冊(cè)完之后兜辞,第一件事情是"Add New Repository"迎瞧。
點(diǎn)擊之后就是創(chuàng)建Repository了,記得下圖中紅框的位置一定要填小寫的maven逸吵,否則無法發(fā)布上去:(
Repository創(chuàng)建完之后凶硅,我們就可以正式進(jìn)入發(fā)布項(xiàng)目之旅了。
Android項(xiàng)目如何發(fā)布扫皱?
1. 發(fā)布步驟
A. 根目錄下build.gradle
先添加
buildscript {
...
dependencies {
...
classpath 'com.novoda:bintray-release:0.4.0'
}
}
以及
allprojects {
repositories {
jcenter()
}
//加上這些
tasks.withType(Javadoc) {
options{ encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
B. 需要發(fā)布的module足绅,修改build.gradle文件
先添加插件
apply plugin: 'com.novoda.bintray-release'
再加上publish
allprojects {
repositories {
jcenter()
}
//加上這些
tasks.withType(Javadoc) {
options{ encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
publish{
userOrg = 'fengzhizi715' // Bintray 賬號(hào)名
groupId = 'com.safframework'
artifactId = 'saf-aop'
publishVersion = '1.0.0'
desc = 'this is an aop library for android'
website = 'https://github.com/fengzhizi715/SAF-AOP'
}
假如 JCenter 審核通過,就可以用多種方式添加該庫了韩脑。
使用gradle添加該庫:
compile 'com.safframework:saf-aop:1.0.0'
使用maven添加該庫:
<dependency>
<groupId>com.safframework</groupId>
<artifactId>saf-aop</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
C. 發(fā)布
執(zhí)行下面的語句
./gradlew clean build bintrayUpload -PbintrayUser=***** -PbintrayKey=************** -PdryRun=false
其中氢妈,PbintrayUser參數(shù)是Bintray的用戶名,
PbintrayKey參數(shù)是先前注冊(cè)賬號(hào)之后獲取的API Key段多。
D. 發(fā)布完之后
不是執(zhí)行完上述的語句就算完了首量,還需要通過 JCenter 的審核。
當(dāng)然不通過審核也是可以使用的进苍,在根目錄的build.gradle中添加形如下面的腳本
allprojects {
repositories {
jcenter()
maven{url 'https://dl.bintray.com/fengzhizi715/maven/'}
}
//加上這些
tasks.withType(Javadoc) {
options{ encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
最為重要的是下面這一句加缘,但是通過審核的話完全不需要添加這一句。
maven{url 'https://dl.bintray.com/fengzhizi715/maven/'}
所以觉啊,我們需要通過JCenter審核拣宏,否則沒有意義。
E. 審核通過
JCenter 會(huì)通過郵件和站內(nèi)消息的形式通知到你杠人,一般情況是幾個(gè)小時(shí)之后勋乾,我也遇到過1天多的情況,完全看人品嗡善。個(gè)人經(jīng)驗(yàn)是晚上12點(diǎn)多發(fā)布辑莫,差不多2點(diǎn)多會(huì)審核通過。
審核通過后罩引,就可以盡情地在項(xiàng)目中使用了摆昧。
2. 升級(jí)庫
發(fā)布新版本時(shí),必須修改publish的publishVersion蜒程。如果publishVersion已經(jīng)存在,上傳時(shí)會(huì)報(bào)錯(cuò)并給出如下類似的提示伺帘。
* What went wrong:
Execution failed for task ':saf-aop:bintrayUpload'.
> Could not upload to 'https://api.bintray.com/content/fengzhizi715/maven/saf-aop/1.0.0/com/safframework/saf-aop/1.0.0/saf-aop-1.0.0-sources.jar': HTTP/1.1 409 Conflict [message:Unable to upload files: An artifact with the path 'com/safframework/saf-aop/1.0.0/saf-aop-1.0.0-sources.jar' already exists]
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
需要將版本號(hào)修改昭躺,必須高于原先的版本號(hào)。
3. 項(xiàng)目中包含多個(gè)module的注意事項(xiàng)
像<<用kotlin打造簡化版本的ButterKnife>>中有三個(gè)module:
我將每個(gè)module都發(fā)布到 JCenter 上伪嫁,如果某一個(gè)module需要升級(jí)领炫,怎么辦?
可以在工程最外層的build.gradle底部添加
tasks.getByPath(":saf-injectview:bintrayUpload").enabled = true // 假設(shè)saf-injectview需要升級(jí)张咳,其他module不用升級(jí)
tasks.getByPath(":saf-injectview-compiler:bintrayUpload").enabled = false
tasks.getByPath(":saf-injectview-annotations:bintrayUpload").enabled = false
簡而言之就是
tasks.getByPath(":需要升級(jí)的module:bintrayUpload").enabled = true
tasks.getByPath(":不需要升級(jí)的module:bintrayUpload").enabled = false
最后再執(zhí)行二進(jìn)制上傳:
./gradlew clean build bintrayUpload -PbintrayUser=***** -PbintrayKey=************** -PdryRun=false
Kotlin項(xiàng)目如何發(fā)布?
1. Kotlin for Android項(xiàng)目
除了跟 Android 項(xiàng)目一樣之外帝洪。還需要在module的build.gradle中額外添加
android {
...
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
值得注意的是似舵,以前發(fā)布日志框架時(shí)遇到過一次坑。報(bào):saf-log:releaseAndroidJavadocs出錯(cuò)葱峡。
我在根目錄的build.gradle中添加以下腳本即可
tasks.getByPath(":saf-log:releaseAndroidJavadocs").enabled = false
其他的項(xiàng)目沒有遇到過這種情況砚哗。
2. 單獨(dú)的Kotlin項(xiàng)目
同樣卤档,需要在build.gradle中添加類似的腳本
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
貼一段完整的build.gradle
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'com.novoda.bintray-release'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
allprojects {
repositories {
jcenter()
}
//加上這些
tasks.withType(Javadoc) {
options{ encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
publish{
userOrg = 'fengzhizi715'
groupId = 'com.safframework.injectview'
artifactId = 'saf-injectview-annotation'
publishVersion = '1.0.0'
desc = 'The annotation used in saf injectview library'
website = 'https://github.com/fengzhizi715/SAF-Kotlin-InjectView'
}
雖然這是一個(gè) Java 工程友雳,但是它完全用 Kotlin 進(jìn)行編寫玻蝌≡涫裕可以參考我以前的文章<<用kotlin打造簡化版本的ButterKnife>>
兩種 Kotlin 的項(xiàng)目發(fā)布方式都一樣:
./gradlew clean build bintrayUpload -PbintrayUser=***** -PbintrayKey=************** -PdryRun=false
Java項(xiàng)目如何發(fā)布哗脖?
在Mac平臺(tái)下绍些,Java工程的發(fā)布跟上面的都類似晕拆。
我遇到過gradlew這個(gè)命令權(quán)限不夠绘梦,只需用chmod命令修改下權(quán)限胸哥。
chomd 777 gradlew
總結(jié)
看完是不是覺得借助 gradle 將項(xiàng)目發(fā)布到 JCenter 很酷而且一點(diǎn)也不難涯竟,也有沖動(dòng)把自己的"輪子"發(fā)布到 JCenter 上?如果有的話空厌,趕緊發(fā)布吧庐船,方便自己也方便大家使用:)。
最后蝇庭,注意com.novoda.bintray-release這個(gè)插件已經(jīng)升級(jí)到0.5.0版本醉鳖,如果gradle還在使用3.3以及之前的版本,請(qǐng)不要使用這個(gè)插件的0.5.0版本哮内,否則會(huì)無法上傳成功盗棵,請(qǐng)使用0.4.0版本。