Android Studio把library分發到jCenter和Maven Central

若是你想在Android Studio中引入一個library到你的項目,你只需添加以下的一行代碼到模塊的build.gradle文件中。 android

1
2
3
dependencies {
     compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
}

就是如此簡單的一行代碼,你就可使用這個library了。 git

酷呆了。不過你可能很好奇Android Studio是從哪裏獲得這個library的。這篇文章將詳細講解這是怎麼回事,包括如何把你的庫發佈出去分享給世界各地的其餘開發者,這樣不只可讓世界更美好,還能夠耍一次酷。 github

Android studio 是從哪裏獲得庫的?

先從這個簡單的問題開始,我相信不是每一個人都徹底明白Android studio 是從哪裏獲得這些library的。莫非就是Android studio 從google搜索而後下載了一個合適的給咱們? web

呵呵,沒那麼複雜。Android Studio是從build.gradle裏面定義的Maven 倉庫服務器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的文件服務器。總的來講,只有兩個標準的Android library文件服務器:jcenter 和  Maven Central。 apache

jcenter

jcenter是一個由 bintray.com維護的Maven倉庫 。你能夠在這裏看到整個倉庫的內容。 windows

咱們在項目的build.gradle 文件中以下定義倉庫,就能使用jcenter了: api

1
2
3
4
5
allprojects {
     repositories {
         jcenter ( )
     }
}

Maven Central

Maven Central 則是由sonatype.org維護的Maven倉庫。你能夠在這裏看到整個倉庫。 安全

注:無論是jcenter仍是Maven Central ,二者都是Maven倉庫 服務器

咱們在項目的build.gradle 文件中以下定義倉庫,就能使用Maven Central了: app

1
2
3
4
5
allprojects {
     repositories {
         mavenCentral ( )
     }
}

注意,雖然jcenter和Maven Central 都是標準的 android library倉庫,可是它們維護在徹底不一樣的服務器上,由不一樣的人提供內容,二者之間毫無關係。在jcenter上有的可能 Maven Central 上沒有,反之亦然。

除了兩個標準的服務器以外,若是咱們使用的library的做者是把該library放在本身的服務器上,咱們還能夠本身定義特有的Maven倉庫服務器。Twitter的Fabric.io 就是這種狀況,它們在https://maven.fabric.io/public上維護了一個本身的Maven倉庫。若是你想使用Fabric.io的library,你必須本身以下定義倉庫的url。

1
2
3
repositories {
     maven { url 'https://maven.fabric.io/public' }
}

而後在裏面使用相同的方法獲取一個library。

1
2
3
dependencies {
     compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}

可是將library上傳到標準的服務器與自建服務器,哪一種方法更好呢?固然是前者。若是將咱們的library公開,其餘開發者除了一行定義依賴名的代碼以外不須要定義任何東西。所以這篇文章中,咱們將只關注對開發者更友好的jcenter 和 Maven Central 

實際上能夠在Android Studio上使用的除了Maven 倉庫以外還有另一種倉庫:Ivy 倉庫 。可是根據個人經驗來看,我還沒看到任何人用過它,包括我,所以本文就直接忽略了。

理解jcenter和Maven Central

爲什麼有兩個標準的倉庫?

事實上兩個倉庫都具備相同的使命:提供Java或者Android library服務。上傳到哪一個(或者都上傳)取決於開發者。

起初,Android Studio 選擇Maven Central做爲默認倉庫。若是你使用老版本的Android Studio建立一個新項目,mavenCentral()會自動的定義在build.gradle中。

可是Maven Central的最大問題是對開發者不夠友好。上傳library異常困難。上傳上去的開發者都是某種程度的極客。同時還由於諸如安全方面的其餘緣由,Android Studio團隊決定把默認的倉庫替換成jcenter。正如你看到的,一旦使用最新版本的Android Studio建立一個項目,jcenter()自動被定義,而不是mavenCentral()。

有許多將Maven Central替換成jcenter的理由,下面是幾個主要的緣由。

1
2
3
4
5
6
7
8
9
10
- jcenter經過 CDN發送 library,開發者能夠享受到更快的下載體驗。
 
- jcenter是全世界最大的 Java倉庫,所以在 Maven Central 上有的,在 jcenter上也極有可能有。換句話說 jcenterMaven Central的超集。
 
- 上傳 library到倉庫很簡單,不須要像在 & nbsp ; Maven Central上作不少複雜的事情。
 
- 友好的用戶界面
 
- 若是你想把 library上傳到 & nbsp ; Maven Central ,你能夠在 bintray網站上直接點擊一個按鈕就能實現。
 

基於上面的緣由以及我本身的經驗,能夠說替換到jcenter是明智之舉。

因此咱們這篇文章將把重心放在jcenter,反正若是你能成功把library放在jcenter,轉到 Maven Central 是很是容易的事情。

gradle是如何從倉庫上獲取一個library的?

在討論如何上傳library到jcenter以前,咱們先看看gradle是如何從倉庫獲取library的。好比咱們在 build.gradle輸入以下代碼的時候,這些庫是若是奇蹟般下載到咱們的項目中的。

1
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'

通常來講,咱們須要知道library的字符串形式,包含3部分

1
GROUP_ID : ARTIFACT_ID : VERSION

上面的例子中,GROUP_ID是com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID是fb-like,VERSION是0.9.3。

GROUP_ID定義了library的group。有可能在一樣的上下文中存在多個不一樣功能的library。若是library具備相同的group,那麼它們將共享一個GROUP_ID。一般咱們以開發者包名緊跟着library的group名稱來命名,好比com.squareup.picasso。而後ARTIFACT_ID中是library的真實名稱。至於VERSION,就是版本號而已,雖然能夠是任意文字,可是我建議設置爲x.y.z的形式,若是喜歡還能夠加上beta這樣的後綴。

下面是Square library的一個例子。你能夠看到每一個均可以很容易的分辨出library和開發者的名稱。

1
2
3
4
5
6
dependencies {
   compile 'com.squareup:otto:1.3.7'
   compile 'com.squareup.picasso:picasso:2.5.2'
   compile 'com.squareup.okhttp:okhttp:2.4.0'
   compile 'com.squareup.retrofit:retrofit:1.9.0'
}

那麼在添加了上面的依賴以後會發生什麼呢?簡單。Gradle會詢問Maven倉庫服務器這個library是否存在,若是是,gradle會得到請求library的路徑,通常這個路徑都是這樣的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。好比能夠在http://jcenter.bintray.com/com/squareup/otto/1.3.7https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/

下得到com.squareup:otto:1.3.7的library文件。

而後Android Studio 將下載這些文件到咱們的電腦上,與咱們的項目一塊兒編譯。整個過程就是這麼簡單,一點都不復雜。

我相信你應該清楚的知道從倉庫上下載的library只是存儲在倉庫服務器上的jar 或者aar文件而已。有點相似於本身去下載這些文件,拷貝而後和項目一塊兒編譯。可是使用gradle依賴管理的最大好處是你除了添加幾行文字以外啥也不作。library一會兒就能夠在項目中使用了。

瞭解aar文件

等等,我剛纔說了倉庫中存儲的有兩種類型的library:jar 和 aar。jar文件你們都知道,可是什麼是aar文件呢?

aar文件時在jar文件之上開發的。之因此有它是由於有些Android Library須要植入一些安卓特有的文件,好比AndroidManifest.xml,資源文件,Assets或者JNI。這些都不是jar文件的標準。

所以aar文件就時發明出來包含全部這些東西的。總的來講它和jar同樣只是普通的zip文件,不過具備不一樣的文件結構。jar文件以classes.jar的名字被嵌入到aar文件中。其他的文件羅列以下:
– /AndroidManifest.xml (mandatory)
– /classes.jar (mandatory)
– /res/ (mandatory)
– /R.txt (mandatory)
– /assets/ (optional)
– /libs/.jar (optional)
– /jni//
.so (optional)
– /proguard.txt (optional)
– /lint.jar (optional)
能夠看到.aar文件是專門爲安卓設計的。所以這篇文章將教你如何建立與上傳一個aar形式的library。

如何上傳library到jcenter

我相信你已經知道了倉庫系統的大致工做原理。如今咱們來開始最重要的部分:上傳。這個任務和如何上傳library文件到http://jcenter.bintray.com同樣簡單。若是作到,這個library就算髮布了。好吧,有兩個須要考慮:如何建立aar文件以及如何上傳構建的文件到倉庫。

雖然須要若干步驟,可是我仍是想強調這事並不複雜,由於已經準備好了全部事情。整個過程以下圖:

由於細節比較多,我分爲7部分,一步一步的詳細解釋清楚。

第一部分:在bintray上建立package

首先,你須要在bintray上建立一個package。爲此,你須要一個bintray帳號,並在網站上建立一個package。

第一步:在bintray.com上註冊一個帳號。(註冊過程很簡單,本身完成)

第二步:完成註冊以後,登陸網站,而後點擊maven。

第三步:點擊Add New Package,爲咱們的library建立一個新的package。

第四步:輸入全部須要的信息

雖然如何命名包名沒有什麼限定,可是也有必定規範。全部字母應該爲小寫,單詞之間用-分割,好比,fb-like。

當每項都填完以後,點擊Create Package。

第五步:網頁將引導你到 Package編輯頁面。點擊 Edit Package文字下的Package名字,進入Package詳情界面。

完工!如今你有了本身在Bintray上的Maven倉庫,能夠準備上傳library到上面了。 

Bintray帳戶的註冊就完成了。下一步是Sonatype,Maven Central 的提供者。

第二部分:爲Maven Central建立個Sonatype賬號

1
2
注:若是你不打算把 library上傳到 Maven Central,能夠跳過第二和第三部分。不過我建議你不要跳過,由於仍然有許多開發者在使用這個倉庫。
 

和jcenter同樣,若是你想經過Maven Central,貢獻本身的library,你須要在提供者的網站Sonatype上註冊一個賬號。

你須要知道的就是這個賬號,你須要在Sonatype網站上建立一個IRA Issue Tracker 賬號。請到Sonatype Dashboard 註冊這個賬號。

完成以後。你須要請求獲得貢獻library到Maven Central的權限。不過這個過程對我來講有點無厘頭,由於你須要作的就是在JIRA中建立一個issue,讓它們容許你上傳匹配Maven Central提供的GROUP_ID的library。

要建立上述所講到的issue,訪問Sonatype Dashboard,用建立的賬號登陸。而後點擊頂部菜單的Create。

填寫以下信息:

  • Project: Community Support – Open Source Project Repository Hosting
  • Issue Type: New Project
  • Summary: 你的 library名稱的概要,好比The Cheese Library。
  • Group Id: 輸入根GROUP_ID,好比,com.inthecheeselibrary 。一旦批准以後,每一個以com.inthecheeselibrary開始的library都容許被上傳到倉庫,好比com.inthecheeselibrary.somelib。
  • Project URL: 輸入任意一個你想貢獻的library的URL,好比, https://github.com/nuuneoi/FBLikeAndroid
  • SCM URL: 版本控制的URL,好比 https://github.com/nuuneoi/FBLikeAndroid.git

其他的不用管,而後點擊Create。如今是最難的部分…耐心等待…平均大概1周左右,你會獲准把本身的library分享到 Maven Central。

最後一件事是在Bintray Profile的賬戶選項中填寫本身的Sonatype OSS用戶名。

sonatypeusername

點擊Update,完成。

第三部分:啓用bintray裏的自動註冊

就如我上面提到的,咱們能夠經過jcenter上傳library到Maven Central ,不過咱們須要先註冊這個library。bintray提供了經過用戶界面讓library一旦上傳後自動註冊的機制。

第一步是使用下面的命令行產生一個key。(若是你用的是windows,請在cygwin下作這件事情)

1
gpg -- gen - key

有幾個必填項。部分能夠採用默認值,可是某些項須要你本身輸入恰當的內容,好比,你的真實名字,密碼 等等。

建立了key以後,調用以下的命令查看被建立key的信息。

1
gpg -- list - keys

若是沒沒問題的話,能夠看到下面的信息:

1
2
3
pub    2048R / 01ABCDEF 2015 - 03 - 07
uid                   Sittiphol Phanvilai < yourmail @ email . com >
sub    2048R / 98765432 2015 - 03 - 07

如今你須要把key上傳到keyserver讓它發揮做用。爲此,請調用以下的命令而且將其中的PUBLIC_KEY_ID替換成上面pub一行中2048R/ 後面的 8位16進制值,譬如本例是01ABCDEF。

1
gpg -- keyserver hkp : //pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID

而後,使用以下的命令以ASCII形式導出公共和私有的key,請將yourmail@email.com替換成你前面用於建立key的email。

1
2
gpg - a -- export yourmail @ email . com > public_key_sender . asc
gpg - a -- export - secret - key yourmail @ email . com > private_key_sender . asc

打開Bintray的Edit Profile頁面點擊GPG 註冊。分別在Public Key和 Private Key中填入上一步導出的public_key_sender.asc和 private_key_sender.asc文件中的內容。

1434992443352430.png

點擊Update保存這些key。

最後一步就是啓用自動註冊。到Bintray的主頁點擊maven。
blob.png

點擊編輯
blob.png

勾選中GPG Sign uploaed files automatically以啓用自動註冊。

blob.png

點擊Update保存這些步驟。完成。如今只需點擊一下,每一個上傳到咱們Maven倉庫的東西都會自動註冊並作好轉向Maven Central 。

請注意這是一次性的操做,之後建立的每個library都要應用此操做。

Bintray和Maven Central 已經準備好了。如今轉到Android Studio部分。

第四部分:準備一個Android Studio項目

不少狀況下,咱們須要同時上傳一個以上的library到倉庫,也可能不須要上傳東西。所以我建議最好將每部分分紅一個Module。最好分紅兩個module,一個Application Module一個Library Module。Application Module用於展現庫的用法,Library Module是library的源代碼。若是你的項目有一個以上的library,儘管建立另外的module:1個 module對應1 個library。
blob.png

我相信你們知道如何建立一個新的module,所以就不會深刻講解這個問題了。其實很簡單,基本就是選擇creating an Android Library module ,而後就完了。

blob.png

下一步是把bintray插件應用在項目中。咱們須要修改項目的build.gradle文件中的依賴部分,以下:

1
2
3
4
5
dependencies {
     classpath 'com.android.tools.build:gradle:1.2.3'
     classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
     classpath 'com.github.dcendents:android-maven-plugin:1.2'
}

有一點很是重要,那就是gradle build tools的版本設置成1.1.2以上,由於之前的版本有嚴重的bug,咱們將使用的是最新的版本1.2.3。

接下來咱們將修改local.properties。在裏面定義api key的用戶名以及被建立key的密碼,用於bintray的認證。之因此要把這些東西放在這個文件是由於這些信息時比較敏感的,不該該處處分享,包括版本控制裏面。幸運的是在建立項目的時候local.properties文件就已經被添加到.gitignore了。所以這些敏感數據不會被誤傳到git服務器。

下面是要添加的三行代碼:

1
2
3
bintray . user = YOUR_BINTRAY_USERNAME
bintray . apikey = YOUR_BINTRAY_API_KEY
bintray . gpg . password = YOUR_GPG_PASSWORD

bintray username 放在第一行, API Key放在第二行, API Key能夠在Edit Profile頁面的API Key 選項卡中找到。

最後一行是建立 GPG key的密碼。保存並關閉這個文件。

最後要修改的是module的build.gradle文件。注意前面修改的是項目的build.gradle文件。打開它,在apply plugin: 'com.android.library'以後添加這幾行,以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apply plugin : 'com.android.library'
 
ext {
     bintrayRepo = 'maven'
     bintrayName = 'fb-like'
 
     publishedGroupId = 'com.inthecheesefactory.thecheeselibrary'
     libraryName = 'FBLike'
     artifact = 'fb-like'
 
     libraryDescription = 'A wrapper for Facebook Native Like Button (LikeView) on Android'
 
     siteUrl = 'https://github.com/nuuneoi/FBLikeAndroid'
     gitUrl = 'https://github.com/nuuneoi/FBLikeAndroid.git'
 
     libraryVersion = '0.9.3'
 
     developerId = 'nuuneoi'
     developerName = 'Sittiphol Phanvilai'
     developerEmail = 'sittiphol@gmail.com'
 
     licenseName = 'The Apache Software License, Version 2.0'
     licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
     allLicenses = [ "Apache-2.0" ]
}

bintrayRepo使用默認的,即maven。bintrayName修改爲你上面建立的 package name。其他的項也修改爲和你library信息相匹配的值。有了上面的腳本,每一個人都能經過下面的一行gradle腳本使用這個library。

1
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'

最後在文件的後面追加兩行以下的代碼來應用兩個腳本,用於構建library文件和上傳文件到bintray(爲了方便,我直接使用了github上鍊接到相關文件的連接):

1
2
apply from : 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle'
apply from : 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'

完成!你的項目如今設置好了,準備上傳到bintray吧!

第五部分:把library上傳到你的bintray空間

如今是上傳library到你本身的bintray倉庫上的時候了。請到Android Studio的終端(Terminal)選項卡。

terminal

第一步是檢查代碼的正確性,以及編譯library文件(aar,pom等等),輸入下面的命令:

1
> gradlew install

若是沒有什麼問題,會顯示:

1
BUILD SUCCESSFUL

如今咱們已經成功一半了。下一步是上傳編譯的文件到bintray,使用以下的命令:

1
gradlew bintrayUpload

若是顯示以下你就大喊一聲eureka吧!

1
SUCCESSFUL

在bintray的網頁上檢查一下你的package。你會發如今版本區域的變化。

blob.png

點擊進去,進入Files選項卡,你會看見那裏有咱們所上傳的library文件。

blob.png

恭喜,你的library終於放在了互聯網上,任何人均可以使用了!

不過也別高興過頭,library如今仍然只是在你本身的Maven倉庫,而不是在jcenter上。若是有人想使用你的library,他必須定義倉庫的url,以下:

1
2
3
4
5
6
7
8
9
10
11
repositories {
     maven {
         url 'https://dl.bintray.com/nuuneoi/maven/'
     }
}
 
. . .
 
dependencies {
     compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
}
1
2
譯者注:前面都沒怎麼看懂,看到上面的代碼以後一會兒全懂了,呵呵。
 

你能夠在bintray的web界面找到本身Maven倉庫的url,或者直接吧nuuneoi替換成你的bintray用戶名(由於前面部分其實都是同樣的)。我還建議你直接訪問那個連接,看看裏面究竟是什麼。

可是,就如咱們前面所講的那樣,讓開發者去定義url這種複雜的事情並非分享library的最佳方式。想象一下,使用10個library不得添加10個url?因此爲了更好的體驗,咱們把library從本身的倉庫傳到jcenter上。

第六部分:同步bintray用戶倉庫到jcenter

把library同步到jcenter很是容易。只需訪問網頁並點擊Add to JCenter

blob.png

什麼也不作直接點擊Send。

blob.png

如今咱們所能作的就是等待bintray團隊審覈咱們的請求,大概2-3個小時。一旦同步的請求審覈經過,你會收到一封確認此更改的郵件。如今咱們去網頁上確認,你會在 Linked To 部分看到一些變化。

blob.png

今後以後,任何開發者均可以使用jcenter() repository 外加一行gradle腳原本使用咱們的library了

1
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'

想檢查一下本身的library在jcenter上是否存在?你能夠直接訪問http://jcenter.bintray.com,而後進入和你library的group id 以及artifact id匹配的目錄。在本例中就是com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3。

blob.png

請注意連接到jcenter是一個只需作一次的操做。若是你對你的package作了任何修改,好比上傳了一個新版本的binary,刪除了舊版本的binary等等,這些改變也會影響到jcenter。不過畢竟你本身的倉庫和jcenter在不一樣的地方,因此須要等待2-3分鐘讓jcenter同步這些修改。

同時注意,若是你決定刪除整個package,放在jcenter倉庫上的library不會被刪除。它們會像殭屍同樣的存在,沒有人再能刪除它了。所以我建議,若是你想刪除整個package,請在移除package以前先在網頁上刪除每個版本。

第七部分:上傳library到Maven Central

並非每一個安卓開發者都使用jcenter。仍然有部分開發者還在使用mavenCentral() ,所以讓咱們也把library上傳到Maven Central 吧。

1
2
3
4
5
6
要從 jcenterMaven Central,首先須要完成兩個任務:
 
1 ) Bintray package 已經鏈接到 jcenter
 
2 ) Maven Central上的倉庫已經認證經過
 

若是你已經經過了這些受權,上傳library package到Maven Central就異常簡單了,只需在package的詳情頁面點擊Maven Central 的連接。

syncmavencentral

輸入你的Sonatype用戶名和密碼並點擊Sync。

syncmavencentral2

若是成功,在Last Sync Status中會顯示Successfully synced and closed repo(見圖),可是若是遇到任何問題,則會在Last Sync Errors顯示出來。你須要根據狀況修復問題,能上傳到Maven Central 的library的條件是至關嚴格的,好比+ 號是不能在ibrary版本的依賴定義中使用的。

完成以後,你能夠在  Maven Central Repository 上找到你的library。在那些匹配你ibrary的group id以及artifact id的目錄中。好比本例中就是com -> inthecheesefactory -> thecheeselibrary -> fb-like -> 0.9.3。

恭喜!雖然須要許多步驟,可是每一步都很簡單。並且大部分操做都是一勞永逸的。

如此長篇的文章!但願對你有所幫助。個人英語也許有點晦澀,不過但願至少內容是能夠理解的。

期待能在上面看到你的library大做!

相關文章
相關標籤/搜索