title: Android-釋出項目到到 JCenter 倉庫
date: 2018-02-01 17:03:01
tags:
寫在前面
閱讀這個部落格,你會知道
- Maven 的概念是什麼?
- 為什麼要将代碼上傳到 Maven 倉庫 ?
- Maven 倉庫的位址是從哪裡來 ?
- JCenter 和 Maven Central 是什麼?
- 如何将項目釋出到 JCenter 倉庫?
Maven 是什麼?
Maven 官網 上的介紹:
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
Maven 是一個軟體項目管理工具和建構工具,基于 POM 的概念,Maven 可以參與項目的建構過程,還可以通過一些資訊生成項目報告和文檔。
總結來說,Maven 的功能可以分成三個方面:
-
優秀的建構工具
通過簡單的指令,能夠完成清理、編譯、測試、打包、部署等一系列過程。同時,不得不提的是,Maven 是跨平台的,無論是在 Windows、還是在 Linux 或 Mac 上,都可以使用同樣的指令。
-
依賴管理工具
項目依賴的第三方的開源類庫,都可以通過依賴的方式引入到項目中來。代替了原來需要首先下載下傳第三方 jar,再加入到項目中的方式。進而更好的解決了合作開發中依賴增多、版本不一緻、版本沖突、依賴臃腫等問題。
具體是怎麼實作的呢?Maven 通過坐标系統準确的定位每一個構件,即通過坐标找到對應的 java 類庫。
-
項目資訊管理工具
能夠管理項目描述、開發者清單、版本控制系統位址、許可證等一些比較零散的項目資訊。除了直接的項目資訊,通過 Maven 自動生成的站點,以及一些已有的插件,還能夠輕松獲得項目文檔、測試報告、靜态分析報告、源碼版本、日志報告等非常具有價值的項目資訊。
我們的開發過程中, Maven 是作為一個依賴管理工具的角色,我們把三方庫上傳到 Maven 的遠端倉庫中,項目建構的時候,通過 build.gradle 中的配置,去 Maven 倉庫中找到對應的庫,就開始下載下傳對應的 aar 或 jar,并依賴到項目中。
Maven 倉庫是什麼?有哪幾種?
當搜尋
上傳 aar 到 Maven 倉庫
,會看到很多相關部落格,其中上傳的代碼都大同小異,但是目标倉庫卻有很多種,大概可以分為以下幾類:
-
JCenter
标準的Maven倉庫,由 Bintray 公司維護,上傳這個倉庫,需要注冊 Bintray 賬号,上傳 library 到自己賬号下的庫位址下,然後同步 JCenter 中央倉庫。
JCenter 現在是 Google 官方預設的中央倉庫。新項目建立時,RootProject 的 build.gradle 的
預設已經添加repositories
倉庫位址。jcenter()
-
Maven Central
同 Jcenter 一樣是标準的 Maven 倉庫,由 Sonatype 維護。上傳這個倉庫,需要注冊 Sonatype 賬号,上傳 library 到自己賬号下的庫位址下,然後同步 Maven Central 中央倉庫。
-
Nexus
Nexus是一個 Maven 倉庫管理器,用來搭建私有倉庫伺服器。公司幾乎都會建立一個 Nexus 私有 Maven 倉庫,用來存放公司内部的三方庫,實作各個子產品間的共享。另外好處就是便于管理,節省公網帶寬,利用内網下載下傳依賴項速度快。
因為有的童鞋沒有私有 Nexus 倉庫管理位址,是以我們這裡用 jCenter 倉庫做示範。
釋出開源項目到到 JCenter 倉庫
JCenter 的使用者資源很多并且十分活躍,而且是 Google 官方預設的中央倉庫,如果想開源一個你的項目, 上傳到 JCenter 不失為是一個好想法。
上傳步驟也很簡單,總結來說隻有四步:
- 注冊一個 Bintray 賬号,建立一個遠端的庫。
- Android Studio 本地準備好開源的項目,請注意是 Library Module。
- 将本地 Library Module 和第一步建立的遠端的庫連接配接起來,将 Library Module 打包成 的aar 和 pom 檔案等上傳到遠端的庫。
- 将遠端庫同步到 JCenter 中央倉庫。
Step 1 : JCenter 遠端庫準備
1.去 Bintray 網站 注冊一個賬号。Bintray 賬号有個人賬号和企業賬号之分,這裡切記,要注冊個人号。看下圖箭頭所指:
2.登入賬号 ,點選
Add New Repository
,建立一個存儲庫,用來托管我們的代碼。Name 可以任意,但是請填寫
maven
,後面會解釋原因,Type 選擇 Maven,剩下的是可選項,可以不填。
3.進入剛才建立的 Repository,點選
Add New Package
,建立 Package。Name 任意,Licences 選擇 Apache-2.0,Version control 填入版本管理的位址,我填的是測試項目的 GitHub 倉庫位址,其他項是選填,可以不填。
Step 2 : Android Studio 本地項目準備
此步驟,就是準備好一個要上傳的 Android Library Module 就好啦!
這裡我建立了一個空的庫項目,在其中建立了一個 Java 類和 Activity,用來後面測試這個庫好不好使。
測試無所謂,實際開發的話,還請知悉 Android 庫項目開發官方文檔,裡面有給出開發注意事項,要好好聽谷爹的話。
Step 3 : 本地和遠端對接,開始上傳
Bintray 公司提供了一個 Gradle 插件 gradle-bintray-plugin ,用來将項目上傳到 Bintray 和 jCenter。
配置的步驟有很多,對于不太懂 Gradle 的童鞋,例如我,就算是 Copy & Paste 都很心累,而且粘貼複制後代碼也不是很美觀。
bintray-release 的出現解決了以上問題,我們直接使用 bintray-release 快速配置上傳。
rootProject 的 build.gradle 添加 bintray-release 依賴
我使用的時候,bintray-release 的最新版本是 0.8.0.
buildscript {
repositories {
jcenter()
}
dependencies {
<!-- classpath 'com.novoda:bintray-release:<latest-version>' -->
classpath 'com.novoda:bintray-release:0.8.0'
}
}
moudle 的 build.gradle 配置上傳參數
apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'//添加
//生成源檔案
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
//生成Javadoc文檔
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
//文檔打包成jar
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
//拷貝javadoc檔案
task copyDoc(type: Copy) {
from "${buildDir}/docs/"
into "docs"
}
//上傳到JCenter所需要的源碼檔案
artifacts {
archives javadocJar
archives sourcesJar
}
//解決 JavaDoc 中文注釋生成失敗的問題
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}
//釋出到 Bintray
publish {
userOrg = 'duanruirui' //bintray.com 注冊的使用者名
groupId = 'com.jcenterlibrary' //以後通路 jcenter上此項目的路徑,一般和庫項目的包名一緻
artifactId = 'JCenterDemo' //bintray.com 建立的 Package 名
publishVersion = '1.0.13' //版本号
desc = '這是一個不認真的版本說明' //版本說明,随意
website = 'https://github.com/DRPrincess/DR_MavenDemo' //關于這個開源項目的網站,随意
}
關于 publish 的參數,以上隻是一部分,其實還有很多,具體看 配置publish閉包說明 ,需要解釋一下,bintray-release 預設釋出到 maven 倉庫,這也是上一步
Add New Repository
時,Name 建議填寫
maven
的原因。如果有需要,需要自定義 Publication,詳看 自定義 Publication。
上一步,我們
Add New Package
建立的 Package 的名字這裡也用到了,原因在于,當三方庫上傳到 Maven 倉庫後,Gradle 的引用路徑是:
compile groupId:artifactId:version
groupId : 以後通路 jcenter上此項目的路徑,一般和庫項目的包名一緻。
artifactId : 就是
Add New Package
建立的 Package 的名字 。
version : 三方庫的版本号。
一句 Gradle 指令完成上傳
以上兩部配置準備完畢,在 rootProject 的路徑下執行這句指令即可完成上傳。
./gradlew clean build generatePomFileForReleasePublication bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
這行指令的中兩個參數
BINTRAY_USERNAME
和
BINTRAY_KEY
,需要換上你自己的bintray.com 賬号資訊,分别是使用者名和 API Key。使用者名很好得到,API Key 通過下圖方式,可以拿到:
如果指令執行成功,會看到
BUILD SUCCESSFUL
字樣。
然後去 Bintray 網站 登入後,就可以看到上傳的的項目了,右側可以看到上傳的版本,我測試過很多回,截止到我截圖的時間已經到 1.0.6了。
點選 Files,可檢視上傳的檔案,如下是 1.0.6 版本上傳的檔案:
檔案 | 意義 |
---|---|
JCenterDemo-1.0.6-javadoc.jar | 生成的 java 注釋說明文檔 |
JCenterDemo-1.0.6-sources.jar | 項目源碼,有這個之後,引用該庫的時候,可以點進入看到源碼 |
JCenterDemo-1.0.6.aar | Android 庫項目的歸檔檔案,這是必不可少的檔案 |
JCenterDemo-1.0.6.pom | Maven的基礎。它是一個XML檔案,包含了 Maven 用來建構項目所需要的項目配置的資訊,aar 是不能将庫的依賴打進去的,那些依賴會記在 pom 檔案中。 |
上傳過程中遇到的問題
上傳過程中,我祝福你不會遇到錯誤的情況,但是出現了,也不要煩躁,坑這個東西踩着踩着就平了,遇到錯誤去 bintray-release 的 issues 中查一下,或者問問谷爹,基本都能找到解決方法。
以下我遇到的問題:
- 01:隻上傳了
aar
檔案,沒有生成 pom 檔案
bintray-release 的文檔上給出的指令
隻上傳了./gradlew clean build bintrayUpload
檔案,于是添加了一個aar
,解決了這個問題,最終版就是上面示例的指令。generatePomFileForReleasePublication
- 02:其他三個檔案都上傳了,但是沒有上傳
aar
檔案
這個問題,一般是項目建構失敗導緻的,我是因為資源檔案名字重複,很奇怪,建構失敗,但是其他檔案上傳上去了。遇到這個檔案,仔細看一下建構的輸出原因,總能解決的。
-
03:Could not upload to ‘xxx’: HTTP/1.1 409 Conflict [message:Unable to upload files: An artifact with the path ‘xxx’ already exists]
Maven 不能重複同一個版本,如果上傳新版本,版本号要修改以下,一般是 +1 遞增。
-
04:Javadoc 文檔生成失敗,導緻 build Failed
錯誤資訊:
是因為中文注釋的原因導緻,修改 JavaDoc 的編碼,就可以正常生成和顯示了。解決方法是 Library Module 的 build.gradle 中添加下列代碼:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':jcenterlibrary:javadoc'. > Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): '/Users/admin/AndroidStudioProjects/DR_MavenDemo/jcenterlibrary/build/tmp/javadoc/javadoc.options'
//解決 JavaDoc 中文注釋生成失敗的問題 tasks.withType(Javadoc) { options.addStringOption('Xdoclint:none', '-quiet') options.addStringOption('encoding', 'UTF-8') options.addStringOption('charSet', 'UTF-8') }
Step 4 : Add to JCenter 中央倉庫
最後一步,上傳到 JCenter 中央倉庫
未曾接觸過這個的我,對這最後一步表示有很大的疑惑:
因為在上一步,我們已經将庫項目已經推送到遠端了,那為什麼要有最後這一步呢?
在第三步項目成功上傳後,已經開始使用 Gradle 依賴該開源庫,在 Package 頁面點選 Gradle 可以看到對應的依賴指令。
然後我試了下,發現要使用的話,會報找不到庫的錯誤(1.0.8 的時候忘記截圖了,用 1.0.14 測試的,道理是一樣的,報錯原因是因為找不到這個三方庫),如下圖:
如果想正确引用,需要将遠端庫所在 Repository 位址告訴 Gradle,這個位址從 Bintray 網站可以拿到,如下圖:
然後 rootProject 的 build.gradle 中添加如下内容,即可正确引用:
allprojects {
repositories {
google()
jcenter()
maven { url 'https://dl.bintray.com/duanruirui/maven' } //添加
}
}
那為什麼使用其他第三方庫,不需要加上三方庫作者的 maven 位址呢?
就是因為作者将三方庫同步到 JCenter 的中央倉庫了。
jcenter()
就是中央倉庫的位址。是以為了友善使用,去掉這個三方庫所在 maven 倉庫位址的額外引用,我們最好将庫同步到 JCenter 中央倉庫。
同步的步驟非常簡單,Package 詳情頁面有一個
Add to JCenter
按鈕,點選進入,填寫同步的理由,送出申請即可。通過之後會給發消息通知的。
稽核的速度還是非常快的,上午送出的,下午就收到了通過的站内信,如下圖所示:
現在已經同步到 JCenter 中央倉庫,隻通過一句代碼引用你的第三方庫啦~
寫在最後
以上是本部落格的全部内容,部落格測試用的 Demo 我放在了 GitHub 上,位址在此:DR_MavenDemo,有問題歡迎提 issue。
之前沒接觸過這方面的知識,嘗試使用的時候,再次感覺到自己的學識淺薄,實作過程中出現一些問題,大多一知半解,不知道問題的本質,希望以後的學習中,能夠深入些,了解更多一點。
于是,下篇部落格《Android-Nexus 搭建自己的 Maven 倉庫 & Gradle 上傳依賴包》,繼續出發!
參考部落格
《Maven與nexus》
《How to publish Android Library on Bintray/JCenter》
《放棄JitPack,釋出Android Library到Bintray、JCenter》
《 Android 快速釋出開源項目到jcenter》
歡迎關注個人微信公衆号「淺淺同學的開發筆記」,最新的部落格,好玩的事情,都會在上面分享,期待與你共同成長。