使用 Gradle 發(fā)布 Android 開源項目到 JCenter

Artboard.png

經常使用 Giithub 的同學相信一定對下面的內容不陌生

compile 'com.werb.moretype:moretype:0.2.1'
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
repositories {
    google()
    jcenter()
    maven {url 'https://jitpark.io/'}
}
dependencies {
    complie 'com.github.nisrulz:awesomelib:1.0'
}

通常當我們寫完一個開源庫之后,要把它發(fā)布到 maven 倉庫中残揉,這樣我們就可以遠程依賴我們的開源庫胧后,不必像在用 Eclipse+Ant 組合的時候,引入一個庫都是下載 jar 包或者 aar 包放到 lib 目錄下抱环,然后右鍵添加引用壳快。

當使用 Android Studio+Gradle 的時候,我們就可以向上圖中那樣镇草,從遠端拉取 jar 包和 aar 包引入本地眶痰。

常見的 Maven 倉庫

JCenter、MavenCenter梯啤、JitPack

repositories {
        google()                                // google 倉庫
        jcenter()                               // ?JCenter 倉庫
        mavenCenter()                           // mavenCenter 倉庫
        maven {url 'https://jitpark.io/'}       // jitpark 倉庫
}

當你新建一個 Android 應用的時候竖伯,在根目錄中的 Gradle 中上圖中的配置一定不少見吧。最新的 Android Studio 3.0 中 Google 將自己的依賴包放在了 google ( )因宇,最開始 Android Studio 將 mavenCenter 作為默認的倉庫地址黔夭,但由于 mavenCenter 上傳速度慢宏胯,操作不友好羽嫡,之后 Android Studio 將默認的倉庫地址替換為了 JCenter本姥。如果你是 AS 2 的開發(fā)者,那么 AS 中的默認倉庫為 mavenCenter 和 JCenter杭棵,如果你是 AS 3 的開發(fā)者婚惫,那么 AS 中的默認倉庫為 mavenCenter 、 JCenter 和 google魂爪。

那么 jitpack 又是什么呢先舷?

jitpack 的寫法和前2個不一樣,寫法是 maven {} 里面加入地址滓侍,其實這個才是 maven 倉庫標準引用方法蒋川,jcenter 和 mavenCenter 由于是默認的標準 Android 倉庫,相當于定義了一個別名撩笆。 所以一些自定義的倉庫都是這種寫法然后填入自己的倉庫網址捺球,例如

  maven { url 'https://maven.fabric.io/public' }

Bintray

JCenter 庫是托管在 Bintray 網站上的,所以我們首先需要注冊一個 Bintary 的賬戶夕冲,然后新建一個我們自己的 maven 倉庫氮兵,之后需要發(fā)布我們的開源庫到 Bintary 上的 maven 倉庫中,最后將我們的開源庫提交的 JCenter 中歹鱼。流程就是這樣泣栈,好了當然沒有這么簡單,下面就為大家介紹具體的操作流程弥姻。

  1. 創(chuàng)建 Bintray 賬戶
jent6.png

這是 Bintary 的主頁南片,但我們不能直接點圖中的綠色按鈕注冊,因為 Bntary 增加了 Organization 的概念庭敦,點擊綠色按鈕是默認創(chuàng)建一個組織的賬戶疼进,我們需要創(chuàng)建的是自己的個人賬戶,所以這是一個注意的地方螺捐,千萬不要選錯颠悬。

那么個人賬戶創(chuàng)建的地方是哪里呢?
https://bintray.com/signup/oss
就是上面的這個地址定血,點擊進去創(chuàng)建個人賬戶赔癌,網頁點開是這樣的

jcent7.png

登錄成功之后點擊創(chuàng)建一個 maven 倉庫

jcent8.png

填寫倉庫配置信息,type 選擇 maven

jcent10.png

創(chuàng)建成功以后你會看到下面這個頁面澜沟,我這里創(chuàng)建的 maven 倉庫名叫 MyLibrary

jcent11.png
  1. 獲取 API key

點擊網頁右上角的頭像 Edit Profile灾票,按照圖中的操作保存我們的 API key,通過 API key 我們可以在 Android Studio 中發(fā)布我們的開源庫到 Bintray 中茫虽。

jcent13.png
  1. 配置我們的開源庫

如圖所示刊苍,我們新建了一個 android-bintray-build 的 Android 項目既们,其中建了一個 Library moudle 叫做 bintraybuild,這個就是我們要上傳的開源庫正什,新建完成之后需要將項目上傳至 Github啥纸。
jcent12.png

上傳的方式有兩種,第一種是通過 bintray 官方出的插件

bintray/gradle-bintray-plugin

第二種是一個國外組織開源的插件

novoda/bintray-release

下面會為大家依次介紹這兩種插件的使用方式

bintray/gradle-bintray-plugin

  1. 在項目根目錄下的 build.gradle 添加插件依賴
buildscript {
    
    repositories {
        google()
        jcenter()
        maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
  1. 在項目根目錄下的 gradle.properties 中配置我們的開源庫信息
PROJ_NAME=bintray-build
PROJ_GROUP=com.werb.bintraybuild
PROJ_ARTIFACTID=bintraybuild
PROJ_VERSION=0.1.0
PROJ_WEBSITEURL=https://github.com/Werb/android-bintray-build
PROJ_ISSUETRACKERURL=https://github.com/Werb/android-bintray-build/issues
PROJ_VCSURL=https://github.com/Werb/android-bintray-build.git
PROJ_DESCRIPTION=bintraybuild project

DEVELOPER_ID=wanbo
DEVELOPER_NAME=werbhelius
DEVELOPER_EMAIL=werbhelius@gmail.com
  1. 在項目根目錄下的 local.properties 中填寫我們的 userAPI key婴氮,這里的內容是完全可以放在 gradle.properties 中的斯棒,但是通常我們的開源庫都會發(fā)到 Github 的公共倉庫中,如果這樣的話那我們的 API key 就會暴露給其他人主经,那當然是不行的荣暮,所以我們就在 git 忽略的 local.properties 中配置我們的 API key。
BINTRAY_USER=werbhelius
BINTRAY_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  1. 在我們開源庫的目錄下罩驻,新建一個 bintray.gradle 文件穗酥,用于上傳開源庫以及配置發(fā)布的文件內容包括源碼,文檔以及 AAR惠遏。
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += configurations.compile
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "https://androiddoc.qiniudn.com/reference/"
        title "$PROJ_NAME $PROJ_VERSION"
    }
}

artifacts {
    archives sourcesJar
    archives javadocJar
}

install {
    repositories.mavenInstaller {
        pom.project {
            name PROJ_NAME
            description PROJ_DESCRIPTION
            url PROJ_WEBSITEURL
            inceptionYear '2017'

            packaging 'aar'
            groupId PROJ_GROUP
            artifactId PROJ_ARTIFACTID
            version PROJ_VERSION

            licenses {
                license {
                    name 'The Apache Software License, Version 2.0'
                    url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    distribution 'repo'
                }
            }
            scm {
                connection PROJ_VCSURL
                url PROJ_WEBSITEURL

            }
            developers {
                developer {
                    id DEVELOPER_ID
                    name DEVELOPER_NAME
                    email DEVELOPER_EMAIL
                }
            }
        }
    }
}

bintray {

    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    user = properties.getProperty('BINTRAY_USER')
    key = properties.getProperty('BINTRAY_KEY')
    configurations = ['archives']

    dryRun = false
    publish = true

    pkg {
        repo = 'MyLibrary'
        name = PROJ_NAME
        licenses = ['Apache-2.0']
        vcsUrl = PROJ_VCSURL
        websiteUrl = PROJ_WEBSITEURL
        issueTrackerUrl = PROJ_ISSUETRACKERURL
        publicDownloadNumbers = true
        version {
            name = PROJ_VERSION
            desc = PROJ_DESCRIPTION
            vcsTag = PROJ_VERSION

            gpg {
                sign = true
            }
        }
    }
}

這里向大家介紹一下 aarjar 的區(qū)別砾跃。
.jar :只包含了 class 文件與清單文件,不包含資源文件爽哎,如圖片等所有 res 中的文件蜓席。
.aar:包含所有資源,
class** 以及 res 資源文件全部包含课锌。

如果你只是一個簡單的類庫那么使用生成的 *.jar文件即可厨内;如果你的是一個UI庫,包含一些自己寫的控件布局文件以及字體等資源文件那么就只能使用 *.aar 文件渺贤。

  1. 在我們開源庫中的 build.gradle 文件中引入 bintary.gradle 雏胃,注意引入的命令需要寫在最后一行,不然會報錯志鞍。
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

apply from: './bintray.gradle'
  1. 當上述的配置全部完成之后瞭亮,我們可以上傳我們的開源庫了,打開 Terminal固棚,執(zhí)行 ./gradlew install统翩,執(zhí)行完成后,打開 build 目錄你會發(fā)現(xiàn)生成了 aar 包此洲、javadoc 文檔厂汗、sources 源碼以及上傳 maven 需要的 pom 配置文件
    jcent22.png
  2. 生成上述文件后呜师,繼續(xù)在 Terminal 中執(zhí)行 ./gradlew bintrayUpload 提示成功之后娶桦,我們的開源庫就發(fā)布成功啦。
    jcent23.png

    發(fā)布成功之后,打開之前 bintray 網頁衷畦,你會發(fā)現(xiàn)在之前我們創(chuàng)建的 maven 倉庫中栗涂,已經有我們剛剛發(fā)布的庫了。
    jcent24.png

novoda/bintray-release

使用這個插件上傳比較簡單祈争,只需要兩步就可以

  1. 在項目根目錄下的 build.gradle 添加插件依賴
buildscript {
    
    repositories {
        google()
        jcenter()
        maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.novoda:bintray-release:0.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
  1. 在開源庫的目錄中 build.gradle 中配置上傳的信息斤程,同樣配置到文件的最后。
apply plugin: 'com.novoda.bintray-release'
publish {
    repoName = "MyLibrary"
    userOrg = 'werbhelius'
    groupId = 'com.werb.bintrayrelease'
    artifactId = 'bintrayrelease'
    publishVersion = '0.1.0'
    desc = 'bintraybuild project'
    website = 'https://github.com/Werb/android-bintray-build'
}
  1. 發(fā)布我們的開源項目铛嘱,在 Terminal 輸入以下命令暖释,替換 BINTRAY_USERNAME 和 BINTRAY_KEY 為你自己的 user 和 API key,執(zhí)行命令之前需 Gradle Build墨吓。
./gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

這樣我們的開源庫就上傳成功啦。

發(fā)布到 JCenter

在 bintray 開源庫的網頁中纹磺,右邊會有 Add to JCenter 的提示帖烘,點擊提交 commit 就可以啦,一般在幾個小時或一天的時間就會提示你添加成功橄杨。


jcent29.png

jcent28.png

使用我們的開源庫

這里向大家介紹一下我們之前配置的信息秘症,兩種發(fā)布方式的配置信息是一致的,我們以
bintray/gradle-bintray-plugin 為例式矫。

PROJ_NAME=bintray-build
PROJ_GROUP=com.werb.bintraybuild
PROJ_ARTIFACTID=bintraybuild
PROJ_VERSION=0.1.0
PROJ_WEBSITEURL=https://github.com/Werb/android-bintray-build
PROJ_ISSUETRACKERURL=https://github.com/Werb/android-bintray-build/issues
PROJ_VCSURL=https://github.com/Werb/android-bintray-build.git
PROJ_DESCRIPTION=bintraybuild project

DEVELOPER_ID=wanbo
DEVELOPER_NAME=werbhelius
DEVELOPER_EMAIL=werbhelius@gmail.com
  • PROJ_NAME : 開源庫的名字
  • PROJ_GROUP : 用于上傳的 group id
  • PROJ_ARTIFACID : 使用的 artifactId
  • PROJ_VERSION : 發(fā)布的版本
  • PROJ_WEBSITEURL : Github 地址
  • PROJ_ISSUETRACKURL : Issue 地址
  • PROJ_VCSURL : git 地址
  • PROJ_DESCRIPTION : 開源庫的描述

所以當我們的庫發(fā)布成功之后 Gradle 的依賴地址的格式為:

implementation 'groupId:artifactId:version'

如果你成功發(fā)布到 JCenter 就可以直接按照上面的規(guī)則依賴自己的項目乡摹。

如果你沒有發(fā)布到 JCenter 需要在項目根目錄中的 build.gradle 中添加你的 maven 倉庫地址。

buildscript {
    
    repositories {
        google()
        jcenter()
        maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.novoda:bintray-release:0.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {url 'https://dl.bintray.com/werbhelius/MyLibrary/'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

注意事項

  1. 不同的開源庫需上傳至不同的 Github 倉庫中采转,因為我們在 bintray 上會指定開源庫的 Github 地址聪廉,請確保唯一性。
  2. 隨著 Android Studio 3.0 的發(fā)布故慈,Gradle 更新到了 4.1+板熊,在 Gradle 3.6 之后的版本,增加了 implementation 和 api 等新的依賴命令察绷,需要注意的是干签,以上兩種插件的 Gradle 版本均在 3.6 以下,所以是不支持新的命令的拆撼。這樣會引發(fā)一個錯誤容劳,當你的 Labrary 依賴其他開源項目的時候,如果你是使用的 implementation 和 api 等新的依賴命令闸度,在生成 aar 和 maven pom 文件時竭贩,pom 文件中并不會把你 Labrary 中所依賴的其他庫配置進去,這樣當在使用你的 Labrary 構建依賴的時候筋岛,Gradle 不會把 Labrary 中所依賴的庫一并下載下來娶视,當使用這些庫的時候就會引發(fā) ClassNotFound 的錯誤。所以在上面兩個插件還沒有更新到最新版的 Gradle 的時候,請繼續(xù)使用舊的 compile 依賴命令肪获。
  3. 有關 Android Studio 3.0 新的依賴方式寝凌,請查看上期更新的文章:Android Studio 3.0 新的依賴方式

源碼

有關以上兩種上傳方式的代碼已經發(fā)布到 Github,關于更多的配置可以參照 Github 上面的代碼孝赫,地址如下:
https://github.com/Werb/android-bintray-build

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末较木,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子青柄,更是在濱河造成了極大的恐慌伐债,老刑警劉巖鸟妙,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件火邓,死亡現(xiàn)場離奇詭異碟狞,居然都是意外死亡筒狠,警方通過查閱死者的電腦和手機袋倔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門益楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹋凝,“玉大人脐瑰,你說我怎么就攤上這事飒货∑切疲” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵塘辅,是天一觀的道長晃虫。 經常有香客問我,道長扣墩,這世上最難降的妖魔是什么哲银? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮沮榜,結果婚禮上盘榨,老公的妹妹穿的比我還像新娘。我一直安慰自己蟆融,他們只是感情好草巡,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著型酥,像睡著了一般山憨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弥喉,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天郁竟,我揣著相機與錄音,去河邊找鬼由境。 笑死棚亩,一個胖子當著我的面吹牛蓖议,可吹牛的內容都是我干的。 我是一名探鬼主播讥蟆,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼勒虾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘸彤?” 一聲冷哼從身側響起修然,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎质况,沒想到半個月后愕宋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡结榄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年中贝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潭陪。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡雄妥,死狀恐怖,靈堂內的尸體忽然破棺而出依溯,到底是詐尸還是另有隱情,我是刑警寧澤瘟则,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布黎炉,位于F島的核電站,受9級特大地震影響醋拧,放射性物質發(fā)生泄漏慷嗜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一丹壕、第九天 我趴在偏房一處隱蔽的房頂上張望庆械。 院中可真熱鬧,春花似錦菌赖、人聲如沸缭乘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堕绩。三九已至,卻和暖如春邑时,著一層夾襖步出監(jiān)牢的瞬間奴紧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工晶丘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留黍氮,地道東北人唐含。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像沫浆,于是被迫代替她去往敵國和親捷枯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容