前沿
網上的步驟看起來實在太麻煩,gituhb上偶然間看到的一個項目,經過實際驗證確實可行。github連接:https://github.com/xiaopansky/android-library-publish-to-jcenter
這是一個幫助Android開發者將aar發布到jcenter的項目,這個項目已經將需要寫的腳本封裝好了,我們只需要配置相關屬性即可在5分鍾之內發布我們的項目到JCenter
先看一下上傳過程圖解
步驟
1. 注冊Bintray賬號 (傳送門)
Bintray是jcenter的托管商,因此你必須注冊一個Bintray賬號,注冊完賬號后記下你的用戶名以及API Key。
登陸后在首頁右上角點擊用戶名進入個人主頁,然后點擊用戶名下面的Edit進入個人信息編輯頁面,接下來點擊頁面左邊列表的最后一項API Key
如圖所示點擊最右邊箭頭指示的復制按鈕即可復制你的API Key
2. 檢查Android插件版本
首先你要檢查你的Android插件的版本,因為1.1.0版本有一個BUG會導致生成javadoc失敗,所以你只需升級到最新即可。目前最新版本是1.3.0,在項目根目錄下的build.gradle文件中修改版本號即可,如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }
如果你在看到這篇文章的時候有更新的版本的話,直接改為最新的版本即可。
3. 添加所需插件
在項目根目錄下build.gradle文件中的dependencies節點中追加如下代碼:
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
android-maven-gradle-plugin插件是用來打包Maven所需文件的
gradle-bintray-plugin插件是用來將生成的Maven所需文件上傳到Bintray的
完成后如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }
4. 配置項目信息
下載project.properties文件並放到你的library module目錄下
project.properties文件的原始內容如下:
#project project.name= project.groupId= project.artifactId= project.packaging=aar project.siteUrl= project.gitUrl= #javadoc javadoc.name=
詳解:
- project.name:項目名稱
- project.groupId:項目組ID,通常情況下如果你的包名為com.example.test,那么項目組ID就是com.example
- project.artifactId:項目ID,通常情況下如果你的包名為com.example.test,那么項目ID就是test
- project.packaging:包類型,Android庫是aar
- project.siteUrl:項目官方網站的地址,沒有的話就用Github上的地址,例如:https://github.com/xiaopansky/Sketch
- project.gitUrl:項目的Git地址,例如:https://github.com/xiaopansky/Sketch.git
- javadoc.name:生成的javadoc打開后主頁顯示的名稱,通常跟項目名稱一樣即可
完成配置后如下所示:
#project project.name=Sketch project.groupId=me.xiaopan project.artifactId=sketch project.packaging=aar project.siteUrl=https://github.com/xiaopansky/Sketch project.gitUrl=https://github.com/xiaopansky/Sketch.git #javadoc javadoc.name=Sketch
5. 配置Bintray賬號以及開發者信息
下載local.properties文件並放到你的library module目錄下
local.properties文件的原始內容如下:
#bintray bintray.user= bintray.apikey= #developer developer.id= developer.name= developer.email=
詳解:
- bintray.user:你的Bintray的用戶名
- bintray.apikey:你的的Bintray的API Key
- developer.id:通常是你在開源社區的昵稱
- developer.name:你的姓名
- developer.email:你的郵箱
完成配置后如下所示:
#bintray bintray.user=xiaopansky bintray.apikey=***************************** #developer developer.id=xiaopan developer.name=******** developer.email=sky@xiaopan.me
*號顯示的為個人信息不反方便透露,還請見諒
注意要將local.proerties文件加入忽略列表,以免被提交到Github或其他網站泄露個人信息
6. 配置bintrayUpload.gradle
方法1:直接使用遠程bintrayUpload.gradle文件
修改你的library module的build.gradle文件,在最后加上apply from: "https://raw.githubusercontent.com/xiaopansky/android-library-publish-to-jcenter/master/bintrayUpload.gradle"
,如下所示:
apply plugin: 'com.android.library' android { compileSdkVersion 22 buildToolsVersion "22.0.0" defaultConfig { minSdkVersion 7 targetSdkVersion 22 versionCode 100 versionName "1.0.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } apply from: "https://raw.githubusercontent.com/xiaopansky/android-library-publish-to-jcenter/master/bintrayUpload.gradle"
方法2:下載后使用本地bintrayUpload.gradle文件
首先下載bintrayUpload.gradle文件並放到你的library module目錄下
然后修改你的library module的build.gradle文件,在最后加上apply from: "bintrayUpload.gradle"
,如下所示:
apply plugin: 'com.android.library' android { compileSdkVersion 22 buildToolsVersion "22.0.0" defaultConfig { minSdkVersion 7 targetSdkVersion 22 versionCode 100 versionName "1.0.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } apply from: "bintrayUpload.gradle"
推薦大家使用第一種方案,簡單快捷,至此配置工作已全部結束
7. 執行命令打包並上傳到Bintray
打開終端進入項目目錄下,執行gradlew bintrayUpload
命令即可
另外,如果你的本地已經配置了Gradle了,那么執行gradle bintrayUpload
命令也可以。gradlew是Gradle的一層封裝,如果你本地沒有安裝Gradle gradlew就會自動下載Gradle
8. 請求提交你的項目到jcenter
前面所有步驟走完之后實際上只是上傳了你的項目到Bintray而已,並沒有被包含在jcenter中,要想提交到jcenter中還需要Bintray的審核。
登入Bintray網站,進入個人中心,在右側的Owned Repositories區域點擊Maven的圖標,進入你的Maven項目列表。
如果已經上傳成功了,在這里就能看到你的項目,進入項目詳情,在右下角的Linked To區域點擊Add to JCenter,然后在Comments輸入框里隨便填寫下信息,最后點Send提交請求即可
一般情況下審核需要4到5個小時,耐心等待就行了,審核通過后會給你發郵件通知你,並且以后更新項目就不需要再審核了。
9. 一句話導入你的項目
當審核通過后,別人就可以一句話導入你的項目了,例如:
compile 'me.xiaopan:sketch:2.0.0'
10. 額外補充:
保持你的library module的名字同artifactId一樣
因為在Bintray上你的項目的maven-metadata.xml文件的路徑是gruopId+"/"+module名稱
。
例如你的groupId是com.example,artifactId是test,但module名稱是library。
這時候項目文件是在com.example.test目錄下的,但maven-metadata.xml文件卻是在com.example.library目錄下的。
這樣一來如果你有多個項目groupId一樣,artifactId不一樣,但module名稱都是library的話,可能就會沖突。
目前為止我還沒有找到更好的解決辦法,就只能讓module名稱和artifactId保持一致,如果你們誰有更好的辦法,歡迎留言交流。
11. 參考文章
12. 常見問題
Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory
:當你使用的Gradle版本是2.4以上,Android插件版本是1.3.0以上的時候就會出現這個問題,這時候你只需將android-maven-gradle-plugin插件版本改為classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'即可You are using JDK version ‘java version “1.7.0_71”’. Some versions of JDK 1.7 (e.g. 1.7.0_10) may cause class loading errors in Gradle.Please update to a newer version (e.g. 1.7.0_67)
:當你使用的Gradle版本是2.4以上,Andriod插件版本是1.2.3的時候就會出現這個問題,同樣的你只需要將android-maven-gradle-plugin插件版本改為classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'即可
以上文章轉載:https://github.com/xiaopansky/android-library-publish-to-jcenter
關於jcenter和Maven Central的理解和gradle是如何從倉庫上獲取一個library
如果你想在Android Studio中引入一個library到你的項目,你只需添加如下的一行代碼到模塊的build.gradle文件中。
dependencies { compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3' }
就是如此簡單的一行代碼,你就可以使用這個library了。
酷呆了。不過你可能很好奇Android Studio是從哪里得到這個library的。這篇文章將詳細講解這是怎么回事,包括如何把你的庫發布出去分享給世界各地的其他開發者,這樣不僅可以讓世界更美好,還可以耍一次酷。
Android studio 是從哪里得到庫的?
先從這個簡單的問題開始,我相信不是每個人都完全明白Android studio 是從哪里得到這些library的。莫非就是Android studio 從google搜索然后下載了一個合適的給我們?
呵 呵,沒那么復雜。Android Studio是從build.gradle里面定義的Maven 倉庫服務器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的文件服務器。總的來說,只有兩個標准的Android library文件服務 器:jcenter 和 Maven Central。
jcenter
jcenter是一個由 bintray.com維護的Maven倉庫 。你可以在這里看到整個倉庫的內容。
我們在項目的build.gradle 文件中如下定義倉庫,就能使用jcenter了:
allprojects {
repositories {
jcenter()
}
}
Maven Central
Maven Central 則是由sonatype.org維護的Maven倉庫。你可以在這里看到整個倉庫。
注:不管是jcenter還是Maven Central ,兩者都是Maven倉庫
我們在項目的build.gradle 文件中如下定義倉庫,就能使用Maven Central了:
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。
repositories { maven { url 'https://maven.fabric.io/public' } }
然后在里面使用相同的方法獲取一個library。
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的理由,下面是幾個主要的原因。
- jcenter通過CDN發送library,開發者可以享受到更快的下載體驗。
- jcenter是全世界最大的Java倉庫,因此在Maven Central 上有的,在jcenter上也極有可能有。換句話說jcenter是Maven Central的超集。
- 上傳library到倉庫很簡單,不需要像在 Maven Central上做很多復雜的事情。
- 友好的用戶界面
- 如果你想把library上傳到 Maven Central ,你可以在bintray網站上直接點擊一個按鈕就能實現。
基於上面的原因以及我自己的經驗,可以說替換到jcenter是明智之舉。
所以我們這篇文章將把重心放在jcenter,反正如果你能成功把library放在jcenter,轉到 Maven Central 是非常容易的事情。
gradle是如何從倉庫上獲取一個library的?
在討論如何上傳library到jcenter之前,我們先看看gradle是如何從倉庫獲取library的。比如我們在 build.gradle輸入如下代碼的時候,這些庫是如果奇跡般下載到我們的項目中的。
compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
一般來說,我們需要知道library的字符串形式,包含3部分
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和開發者的名稱。
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.7 和 https://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/<abi>/*.so (optional)
- /proguard.txt (optional)
- /lint.jar (optional)
可以看到.aar文件是專門為安卓設計的。
以上轉載:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html
后記
Gradle 2.4之后已經可以使用JitPack發布項目,這個用起來甚至比上述方法還要簡單的多,感興趣的可以了解一下。
JitPack官網:https://jitpack.io/