[Gradle系列]Gradle發布module(maven)到jcenter, 并構建自己的企業Maven私服

Tamic : http://www.lxweimin.com/users/3bbb1ddf4fd5/

前言


Android開發者經常會看到xx公司發布了xx項目,xx公司提供了gradle配置路徑,我們就能輕松的使用它們的項目到自己的工程中:

譬如:

谷歌自身的庫

compile 'com.android.support:appcompat-v7:22.2.0'

第三方庫

compile 'com.squareup.okhttp:okhttp:2.7.2'

很多開發者看過之后羨慕不已, 想自己能不能也寫一個自己的庫讓別人用(或者發布已有的本地module庫),或者當多模塊開發時,為了進行版本協作,使用自己的maven庫是勢在必得的!

Maven

Apache Maven,是一個軟件(特別是Java軟件)項目管理及自動構建工具,由Apache軟件基金會所提供。基于項目對象模型(縮寫:POM)概念,Maven利用一個中央信息片斷能管理一個項目的構建、報告和文檔等步驟。
更多請點擊:Maven

Maven package 是由所謂 POM(Project Object Model)所定義的文件包的一種輸出特殊格式。

Maven倉庫就是,就是放 Maven包的地方, 所以叫倉庫。 這些倉庫,可以是放在本地,也可以放在遠程服務器上。 可以開放倉庫,也可以加密的,提供別人下載使用!

一句大白話你就懂了:maven是類似android studio的構建工具, maven包是對于構建工具產出的格式,maven包類似是apk,maven倉庫是apk應用市場一樣!

Maven倉庫


Center和MavenCentral

jcenter是由 bintray.com提供的Maven倉庫存放的平臺服務器,用戶可以注冊發布托管自己的開源maven包

Maven Central 是由sonatype.org 提供的發布的Maven服務平臺。雖然Maven Central和jcenter都是標準的maven倉庫服務器。

同樣的倉庫卻毫無聯系。 在jcenter上存在的開源庫,可能 在Maven Central 上并不存在,反之亦然。 就類似豌豆莢和91助手都可以存在apk下載,但不一定都能搜到同一個應用一樣,MavenCentral上發布maven包比發布到jcente有點復雜,當然我們可以將jcenter的包同步到MavenCenter

發布maven包


遠程jcenter

Maven

一首先我們需要在jcenter注冊一個賬號 點我注冊

這里寫圖片描述

如果你有github直接可以用github賬戶注冊! 然后補充下資料信息!

接著登錄成功后我們去獲取這個賬戶的簽名key,用來區分賬戶Id信息,先記錄好自己的
key,后面會用到這個信息。

這里寫圖片描述

創建module

  • 1 創建模塊

如果你是從零開始去寫一個組件模塊,就直接在as為你的app創建一個
module, 如果已有模塊請直接繞道到第三步。

這里寫圖片描述

當創建好你的module是時候就會生成一個自己的library

接著可以在自己module配置gradle

這里寫圖片描述

下面步驟請均在自己的module中gradle中配置加入。

  • 3 申明插件類型
     apply plugin: 'com.github.dcendents.android-maven'
     apply plugin: 'com.jfrog.bintray'
  • 4 配置maven包信息

      //版本號
      version = "1.0.0"
      //這是項目首頁
      def siteUrl = 'https://github.com/NeglectedByBoss/Novate'
      //這是源碼地址
      def gitUrl = 'https://github.com/NeglectedByBoss/Novate.git'
      // 包名,可以寫公司的前綴
      group = "com.tamic.novate"
    
  • 5 定制輸出格式信息

          install {
         repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
       pom {
           //pom信息
           project {
            packaging 'aar'
           // Add your description here
            name 'novate'
            url siteUrl
           // Set your license
      licenses {
        //開源協議
         license {
           name 'The Apache Software License, Version 2.0'
            url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                }
               }
      developers {
        //開發者基本信息
          developer {
          id 'tamic'
          name 'tamic'
          email 'xxxx@xxx.com'
                    }
                }
    
           scm {
              connection gitUrl
              developerConnection gitUrl
              url siteUrl
               }
             }
         }
       }
      }
    
  • 6 輸出資源

    task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
      classifier = 'sources'
     }
     task javadoc(type: Javadoc) {
      source = android.sourceSets.main.java.srcDirs
      classpath += project.files(android.getBootClasspath   ().join(File.pathSeparator))
    }
    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
       from javadoc.destinationDir
     }
     artifacts {
     archives javadocJar
     archives sourcesJar
     }
  • 7 配置賬號

    這時候加入自己的賬號和key,當然你不想加入到local配置中,也可以單獨建個prpertites文件,設置git的忽略規則即可。

    這里寫圖片描述
  • 8 申明編譯類型

    在主項目的gradle中加入下面申明

        buildscript {
        repositories {
        jcenter()
    
       }
       dependencies {
      classpath 'com.android.tools.build:gradle:2.3.0'
      //這里是依賴的插件類型路徑,用最新的即可
       classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
       classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
       }
      }
    

提交maven

當我們將項目build完成以后,as就會生成如下task

這里寫圖片描述

雙擊即可,也可以在命令行輸入 gradle brntaryUpload.

如果成功了,可以去預覽我們的項目,發現會有你發布的包了,我這里有四個項目,如果第一次用只顯示一個,直接點擊預覽自己的Maven包 ,

這里寫圖片描述

接著繼續打開后發現maven包具體預覽界面了,

這里寫圖片描述

這時候需要add到倉庫中心等管理員審核,如果第一次就會有addjcenter按鈕,

這里寫圖片描述

提交會打開一個申請頁面,你填寫評論就Okle ,中文也可以,等一兩小時,收到系統發來的私信,就代表你的庫成功了,這時候就有maven依賴地址生成,我們可以直接拿來配置就可以了

這里寫圖片描述
  • 9 使用mven包

    這個就不用多說了吧,心累!

問題總結

如果發現提示你javadoc不過,就關閉doc檢查,

這里寫圖片描述

如果發現編碼出錯,就指定utf-8

在module的gradle中加入

  javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
}
}

tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
options.addStringOption('charSet', 'UTF-8')
}

如果希望自己代碼混淆請配置好相關規則,這里不再介紹。

Maven Central

可能很多人還想發布到 Maven Central去,可以接著看,雖然長了點,請仔細耐心看完

這里寫圖片描述
  • 創建 issue

    登陸之后,頂部有按鈕,Created,下面是關鍵的條目

    Project: Community Support - Open Source Project Repository Hosting (OSSRH)
    Issue Type: New Project
    Group Id:就是你的包的 groupId

其他信息請加上,提交之后,大概兩個工作日, 等系統給你分配了issue之后,就可以進行下面的工作了,這塊可以參考 點擊介紹

  • 上傳包

    配置gradle

    整個結構,

    這里寫圖片描述

    現在我們將紅框內的task覆蓋,具體如下

      ext {
        PROJ_GROUPID = 'com.tamic.android'
        PROJ_ARTIFACTID = 'novate' //這是項目名字
         PROJ_VERSION_NAME = "1.0.0"http://版本號
    
         POM_PACKAGING = 'aar'
    
        NEXUS_USERNAME = '注冊的賬號'
        NEXUS_PASSWORD = '這是密碼'
        RELEASE_REPOSITORY_URL = '這里是sonatye配置好的線上路徑'
         SNAPSHOT_REPOSITORY_URL = '這里是在 sonatye配置好的snaphot路徑'
     }
    
      uploadArchives {
    
      repositories {
      mavenDeployer {
          snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) {
              authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
          }
          repository(url: RELEASE_REPOSITORY_URL) {
              authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
          }
    
          pom.project {
              version PROJ_VERSION_NAME
              groupId PROJ_GROUPID
              artifactId PROJ_ARTIFACTID
              packaging 'aar'
    
           }
    
        }
    

    }

    當然密碼可以加載jcenter公用的那個properties文件中,防止上傳的代碼git上,
    
     然后運行as命令,或點擊下面這個task即可。
    
這里寫圖片描述

發布maven包

登陸 oss sonatype,登陸,選擇左邊欄里的 Staging Repositories, 然后點Close 按鈕,sonatype 會做響應的 validation,通過的話,就可以點 Release 發布啦,如果不通過,就檢查問題,先 Drop,并重新做 Staging 發布。

檢查包

https://oss.sonatype.org/content/repositories/releases 可以看到你發布的包。

兩者同步

如果你覺得這種方式比較麻煩,那么我們可以將JCenter的項目同步MavenCentral到上,

這里寫圖片描述

搭建企業maven私服

在項目龐大情況下,可能你的項目依賴的module越來越多,這樣對版本控制越來越難,大家想push到maven庫上,但又不想公開自己的maven包,所以MavenCentral提供了自己的企業私服,Sonatype 提供了免費的 sonatype/nexus。

請忽略 作者: http://blog.csdn.net/sk719887916

下載安裝 docker 鏡像

  $ docker pull sonatype/nexus

開啟服務鏡像

  $ docker run -d -p 8081:8089 --name nexus sonatype/nexus:oss

訪問服務器

因為的 docker-machine ip 是:192.168.99.100,于是可以通過在瀏覽器訪問http://192.168.99.100:8089/ 這個 URL 來訪問 sonatype 私服。
條件允許的可以在內網部署一臺服務器,用來運行這個maven私服。甚至找運維可以創建自己的Maven域名

默認賬戶密碼是:

  admin
 admin123

配置倉庫

點擊左側 repository,會出現 repository 的列表,把其中的 Releases 的 Configutation->Access Setting-> Deploy Polocy 設置成 Allow Redeploy 使得可以重復發布包。

配置上傳插件

因為使用了自己的私服 chrisbanes/gradle-mvn-push 插件,要稍微改動,我們需要修改自己的maven私服repository URL 等,

關鍵設置

   ext {
PROJ_GROUPID = 'com.tamic.android'
PROJ_ARTIFACTID = 'android_statSdk'
PROJ_VERSION_NAME = "1.0.0"

POM_PACKAGING = 'aar'

NEXUS_USERNAME = 'admin'
NEXUS_PASSWORD = 'admin123'
RELEASE_REPOSITORY_URL = '修改為你配置的路徑'
SNAPSHOT_REPOSITORY_URL = '修改為你配置的路徑'
}

檢測是否成功

上傳成功之后,就可以在瀏覽器的http://192.168.99.100:8089/content/repositories/releases看到這個包。發現存在,說明已經成功了。

這里寫圖片描述

使用

指定自己的mven倉庫地址

這里寫圖片描述

在root的gradle指定你的maven服務器路徑就ok了,其他moudule配置和使用第三方庫一樣。

發布本地Maven##

有時候你不想發布到自己公司的內網私服上,只想測試下本地打包機制,這時候隨便找個mven包,反到電腦任意路徑下。指定本地路徑就ok了,下面三種可以隨你選擇

allprojects {
    repositories {
     //本機倉庫
     mavenLocal()
     
    //內網maven倉庫
    maven {  url "你的內網私服地址"  }
    maven {
                  
        url "你的Maven路徑"
    }
}

}

經驗采坑

  • 上傳失敗,返回400,可能是Configutation->Access Setting-> Deploy Polocy沒設置好;返回401,可能是賬號密碼錯誤。
  • 如果還出現失敗,請檢版本號是否一致,如果服務器存在的版本號會上傳不了,請先刪除就版本再上傳,

  • 如果出現NOT found you moudle無法上傳情況,請只保留一個android STUDIO,在點擊上傳task.

  • 編譯不過出現 無效的插件類型,請重新升級maven-gradle-plugin版本:1.4.1或者更高

華麗結束


上面展示了兩種發布maven包到倉庫的方式,開發者可以自我去選擇,maven不僅很好的解決了模塊化開發是帶來的版本控制問題,也方便了項目對依賴的舊版本回滾控制, 具體在使用的地方可以自己指定maven版本,這次介紹了怎么在gradle發布maven的姿勢,下節在總結下在多模塊情況下,開發者想用同一套代碼,生成不同apk,設置可以選擇不同資源打包的問題。 gradle多渠道和多版本打包相關的知識,期待你的關注!


圖片發自簡書App

Tamic : http://www.lxweimin.com/users/3bbb1ddf4fd5/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容