天天看點

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

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 不失為是一個好想法。

上傳步驟也很簡單,總結來說隻有四步:

  1. 注冊一個 Bintray 賬号,建立一個遠端的庫。
  2. Android Studio 本地準備好開源的項目,請注意是 Library Module。
  3. 将本地 Library Module 和第一步建立的遠端的庫連接配接起來,将 Library Module 打包成 的aar 和 pom 檔案等上傳到遠端的庫。
  4. 将遠端庫同步到 JCenter 中央倉庫。

Step 1 : JCenter 遠端庫準備

1.去 Bintray 網站 注冊一個賬号。Bintray 賬号有個人賬号和企業賬号之分,這裡切記,要注冊個人号。看下圖箭頭所指:

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

2.登入賬号 ,點選

Add New Repository

,建立一個存儲庫,用來托管我們的代碼。Name 可以任意,但是請填寫

maven

,後面會解釋原因,Type 選擇 Maven,剩下的是可選項,可以不填。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格
Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

3.進入剛才建立的 Repository,點選

Add New Package

,建立 Package。Name 任意,Licences 選擇 Apache-2.0,Version control 填入版本管理的位址,我填的是測試項目的 GitHub 倉庫位址,其他項是選填,可以不填。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格
Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

Step 2 : Android Studio 本地項目準備

此步驟,就是準備好一個要上傳的 Android Library Module 就好啦!

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

這裡我建立了一個空的庫項目,在其中建立了一個 Java 類和 Activity,用來後面測試這個庫好不好使。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

測試無所謂,實際開發的話,還請知悉 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 通過下圖方式,可以拿到:

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格
Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

如果指令執行成功,會看到

BUILD SUCCESSFUL

字樣。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

然後去 Bintray 網站 登入後,就可以看到上傳的的項目了,右側可以看到上傳的版本,我測試過很多回,截止到我截圖的時間已經到 1.0.6了。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

點選 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 檔案中。
Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

上傳過程中遇到的問題

上傳過程中,我祝福你不會遇到錯誤的情況,但是出現了,也不要煩躁,坑這個東西踩着踩着就平了,遇到錯誤去 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

    錯誤資訊:

    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 的編碼,就可以正常生成和顯示了。解決方法是 Library Module 的 build.gradle 中添加下列代碼:
    //解決 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 可以看到對應的依賴指令。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

然後我試了下,發現要使用的話,會報找不到庫的錯誤(1.0.8 的時候忘記截圖了,用 1.0.14 測試的,道理是一樣的,報錯原因是因為找不到這個三方庫),如下圖:

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

如果想正确引用,需要将遠端庫所在 Repository 位址告訴 Gradle,這個位址從 Bintray 網站可以拿到,如下圖:

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

然後 rootProject 的 build.gradle 中添加如下内容,即可正确引用:

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/duanruirui/maven' } //添加

    }
}

           

那為什麼使用其他第三方庫,不需要加上三方庫作者的 maven 位址呢?

就是因為作者将三方庫同步到 JCenter 的中央倉庫了。

jcenter()

就是中央倉庫的位址。是以為了友善使用,去掉這個三方庫所在 maven 倉庫位址的額外引用,我們最好将庫同步到 JCenter 中央倉庫。

同步的步驟非常簡單,Package 詳情頁面有一個

Add to JCenter

按鈕,點選進入,填寫同步的理由,送出申請即可。通過之後會給發消息通知的。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格
Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格

稽核的速度還是非常快的,上午送出的,下午就收到了通過的站内信,如下圖所示:

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : 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》

歡迎關注個人微信公衆号「淺淺同學的開發筆記」,最新的部落格,好玩的事情,都會在上面分享,期待與你共同成長。

Android-釋出項目到到 JCenter 倉庫寫在前面Maven 是什麼?Maven 倉庫是什麼?有哪幾種?釋出開源項目到到 JCenter 倉庫Step 1 : JCenter 遠端庫準備Step 2 : Android Studio 本地項目準備Step 3 : 本地和遠端對接,開始上傳Step 4 : Add to JCenter 中央倉庫寫在最後參考部落格