1. 程式人生 > >Android業務元件化之Gradle和Sonatype Nexus搭建私有maven倉庫

Android業務元件化之Gradle和Sonatype Nexus搭建私有maven倉庫

前言:

     公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以module的形式存在專案中,然後專案依賴本地的module,多少有點不太利於專案的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴的module和主工程放在一個project裡面,這就導致了每個project都需要配置這些依賴關係,如果是公司內多個工程依賴同一個公司內部的業務元件,業務元件有更新時,同步非常麻煩,但公司內部的業務元件不可能部署到公有maven伺服器上,所以有必要搭建一個區域網內的maven伺服器,方便管理公司內部的公共庫及業務元件,通過查閱資料和技術預研確定採用Gradle和Sonatype Nexus搭建私有maven倉庫的方式,今天總結一下如何搭建整套整合環境及簡單的使用。下圖簡單示例一下現在的專案結構:

業務元件化相關部落格:

什麼是Maven?

   Maven 是一個專案管理和自動構建工具。Maven 包集中存放的地方,就是 Maven 倉庫。這些倉庫,可以是放在本地,也可以放在某個遠端伺服器上。 可以是私有倉庫,也可以是公開的。在Android上的使用方式如下

allprojects {
    repositories {
        mavenCentral();
        jcenter()
        maven {
            url 'file:///Users/my-user-name/Documents/Android/repo/'
        }
        maven {
            url 'http://localhost:8081/nexus/content/repositories/releases/'
        }
    }
}

什麼是Gradle?

   Gradle是一個基於JVM的構建工具,是一款通用靈活的構建工具,支援maven, Ivy倉庫,支援傳遞性依賴管理,而不需要遠端倉庫或者是pom.xml和ivy.xml配置檔案,基於Groovy,build指令碼使用Groovy編寫。

 Android支援的Maven倉庫:

  • mavenCentral 是最早的 maven 中央倉庫
  • jcenter 是 Android Studio 0.8 版本起的預設 maven 中央倉庫
  • 本機的倉庫
  • 部署在內網伺服器的私有倉庫

使用Nexus搭建 maven 私服

1.下載Nexus

2.啟動Nexus

 我這裡下載的All platforms - Nexus Repository Manager OSS 2.x - bundle.zip

,下載完成之後,解壓後進入\nexus-2.1.2-bundle\nexus-2.1.2\bin\jsw\,根據不同的系統選擇不同的資料夾進入,資料夾目錄結構如下:

我這裡選擇的是windows-x86-64,大致裡面有這幾個操作項

  • console-nexus 啟動nexus並開啟控制檯
  • install-nexus 將nexus安裝成系統服務
  • start-nexus 開始nexus服務
  • stop-nexus 停止nexus服務
  • uninstall-nexus 解除安裝nexus系統服務

雙擊console-nexus.bat執行。再瀏覽器中輸入http://127.0.0.1:8081/nexus/,如下圖所示就代表nexus已經啟動成功了。

8081是預設的埠號,要修改埠號,進入\conf\開啟nexus.properties檔案,修改application-port屬性值就可以了。 預設的使用者名稱和密碼分別是:admin和admin123。 

3.Nexus倉庫

倉庫型別:

  • hosted(宿主倉庫):用來部署自己,第三方或者公共倉庫的構件
  • proxy(代理倉庫):代理遠端倉庫
  • virtual(虛擬倉庫):預設提供了一個 Central M1虛擬倉庫 用來將maven 2適配為maven 1
  • group(倉庫組):統一管理多個倉庫

Public Repositories: 倉庫組

  • 3rd party: 無法從公共倉庫獲得的第三方釋出版本的構件倉庫
  • Apache Snapshots: 用了代理ApacheMaven倉庫快照版本的構件倉庫
  • Central: 用來代理maven中央倉庫中釋出版本構件的倉庫
  • Central M1 shadow: 用於提供中央倉庫中M1格式的釋出版本的構件映象倉庫
  • Codehaus Snapshots: 用來代理CodehausMaven 倉庫的快照版本構件的倉庫
  • Releases: 用來部署管理內部的釋出版本構件的宿主型別倉庫
  • Snapshots:用來部署管理內部的快照版本構件的宿主型別倉庫

 4.建立宿主倉庫

  新建公司的內部倉庫,步驟為Repositories –> Add –> Hosted Repository,在頁面的下半部分輸入框中填入Repository ID和Repository Name即可,比如分別填入zfy 和 zfy repostiory,另外把Deployment Policy設定為Allow Redeploy,點選save就建立完成了。這裡我點選新增宿主型別的倉庫,在倉庫列表的下方會出現新增倉庫的配置,如下所示:

點選save按鈕後就會在倉庫列表中看到剛才新增的倉庫。

Android 依賴包 AAR

1.什麼是AAR

   AAR檔案是Google為Android開發所設計的一種library格式,全名為Android Archive Library, 與Java Jar Library不同的地方是AAR除了java code之外也包含res,也就是一些圖片、文字等 資原始檔。會設計形式的類別庫是因為Google在Android SDK tool r14之後開始支援Library Project的開發方式,這種Library Project可以說是Android APP的半成品,其目標並不是製作成APK來執行,而是提供現成的View/Activiy等一些資源給其他開發者使用。而 AAR正是這種Library Project編譯後的壓縮包,壓縮後只需傳遞單一檔案即可分享,可以說是相當方便。

2.Android專案打包成AAR

  將一個Android專案打包成AAR你需要在專案的gradle指令碼build.gradle檔案中新增 apply plugin: ‘android-library’,然後編譯專案,在下圖示意的目錄下可以找到打包好的arr檔案

3.Android專案使用AAR

引用遠端的aar

compile 'com.squareup.okhttp3:okhttp:3.6.0'

引用本地aar檔案

compile fileTree(dir: 'libs', include: '*.aar')

 上傳庫到Maven倉庫

1.首先我們建立一個新的AndroidStudio 專案,然後新建一個module,選擇Android Library,類似下面這種結構

Rebuild Project生成依賴的arr包

2.專案的根目錄的build.gradle中配置倉庫地址

allprojects {
    repositories {
        jcenter()
        maven{
            url 'http://localhost:8081/nexus/content/repositories/releases/'
        }
    }
}

3.配置gradle.properties檔案,定義通用屬性

#Maven倉庫的URL
MAVEN_REPO_RELEASE_URL=http://localhost:8081/nexus/content/repositories/releases/
MAVEN_REPO_SNAPSHOT_URL=http://localhost:8081/nexus/content/repositories/snapshots/

#對應maven的GroupId的值
GROUP = com.xxx
#登入nexus ossde的使用者名稱

NEXUS_USERNAME=admin
#登入nexus oss的密碼

NEXUS_PASSWORD=admin123

# groupid
GROUP_ID = com.xxx

# type
TYPE = aar

# description
DESCRIPTION = app.lib

4.修改module對應的build.gradle檔案,新增以下配置

uploadArchives {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            repository(url: MAVEN_REPO_RELEASE_URL) {
                authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
            }
            pom.project {
                version '1.0.0'
                artifactId 'app.lib'
                groupId GROUP_ID
                packaging TYPE
                description DESCRIPTION
            }
        }
    }
}

artifacts {
    archives file('app.lib.aar')
}

5.點選uploadArchives進行編譯上傳

 在as右邊欄,找到Gradle開啟如下

然後雙擊uploadArchives,編譯指令碼並上傳arr檔案到私有倉庫,最後在控制檯可以看到日誌是否上傳成功。

去倉庫檢視到剛剛上傳的庫檔案

在專案中應用

1.新建一個專案在專案的專案的根目錄build.gradle配置如下

maven{
      url 'http://localhost:8081/nexus/content/repositories/releases/'
    }

2.在app目錄下的build.gradle配置如下

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'
    testCompile 'junit:junit:4.12'
    compile 'whoislcj:app.lib:1.0.0'
}

這樣配置就算結束了,就可以正常的使用了。

總結:

  本文學習總結了如何搭建一個私有的maven程式碼倉庫,本文大部分資源來源於這篇部落格使用Gradle和Sonatype Nexus 搭建私有maven倉庫,重新整理一下有助於我記錄整個業務元件化的過程與心得,所以一邊看一邊搭建一邊嘗試。

相關推薦

Android業務元件GradleSonatype Nexus搭建私有maven倉庫

前言:      公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以module的形式存在專案中,然後專案依賴本地的module,多少有點不太利於專案的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴的module和主工程放在一個project裡

Android業務組件GradleSonatype Nexus搭建私有maven倉庫

Android 前言: 公司的業務組件化推進的已經差不多三四個月的時間了,各個業務組件之間的解耦工作已經基本完成,各個業務組件以module的形式存在項目中,然後項目依賴本地的module,多少有點不太利於項目的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴

使用GradleSonatype Nexus 搭建私有maven倉庫

前言: 隨著業務的增長,需求量增多,我們的App 元件也越來越多,幾乎大部分元件都有用到同樣的第三方庫和公司內部封裝的庫,而團隊中的所有人都重複的從maven 遠端的中央倉庫下載構建,這樣就會加大了倉庫的負載和浪費了外網的頻寬,網速慢的話,就要等很久很

Android業務元件現狀分析與探討

前言:       從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的U盤,插在哪

Android業務元件子模組SubModule的拆分以及它們之間的路由Router實現

前言:      前面分析了APP的現狀以及業務元件化的一些探討(Android業務元件化之現狀分析與探討),以及通訊的橋樑Scheme的使用(Android業務元件化之URL Scheme使用),今天重點來聊下子模組SubModule的拆分以及它們之間的路由Router實現。本篇涉及的相關知識比較多,閱讀

Android業務元件URL Scheme使用

前言:      最近公司業務發展迅速,單一的專案工程不再適合公司發展需要,所以開始推進公司APP業務元件化,很榮幸自己能夠牽頭做這件事,經過研究實現元件化的通訊方案通過URL Scheme,所以想著現在還是在預研階段,很有必要先了解一下URL Scheme,看看是如何使用的?其實在之前做Hybrid混合程

Android-使用Nexus搭建私有Maven倉庫

一、先看一些概念 1、Maven倉庫分類 從Maven的依賴下載管理角度來看, Maven倉庫分為遠端倉庫和本地倉庫,遠端倉庫的使用需要新增倉庫地址才能正常連線下載依賴。Maven的遠端倉庫分為中央倉庫和私服倉庫,中央倉庫存放了世界各地上傳的依賴包,比較出名的是Jcent

Android 專案元件建立module,生成aar,引入aar

導言: 在android平時的開發中,經常自己寫的東西讓別人使用,那麼就有module,aar,jar等方式. 1:module通過import module並dependencies完成 2:aar,包括所有檔案的android專用包,通過右邊的gradle->assembl

Android 業務元件開發實踐

本文原創,轉載請以連結形式註明地址:http://kymjs.com/code/2016/10/18/01元件化並不是新話題,其實很早很早以前我們開始為專案解耦的時候就討論過的。但那時候我們說的是功能元件化。比如很多公司都常見的,網路請求模組、登入註冊模組單獨拿出來,交給一個團隊開發,而在用的時候只需要接入對

Android業務元件開發實踐

1. 寫在前面 原文地址:http://kymjs.com/code/2016/10/18/01 借用阿布倪盟博的一句話:“在MDCC中馮森林老師的《迴歸初心,從容器化到元件化》,為我們這些沒有那麼多精力折騰黑科技開發者們打開了另一扇門” 。 元件

Android業務元件開發實踐(轉載)

借用阿布倪盟博的一句話:“在MDCC中馮森林老師的《迴歸初心,從容器化到元件化》,為我們這些沒有那麼多精力折騰黑科技開發者們打開了另一扇門” 。 元件化並不是新話題,其實很早很早以前我們開始為專案解耦的時候就討論過的。但那時候我們說的是功能元件化。比如很多公司都常

Android業務元件開發實踐(二)

前言:       從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的U盤,插在哪裡都可以完美執行,這就是推進業務元件

Android 中打包成aar並上傳到Nexus搭建maven倉庫

目的 方便元件化流通,搭建私有庫有助於多人協作開發專案,提高整合的穩定性和庫引用版本的可控性,也減少繁瑣的第三方庫的釋出工作。 環境搭建 下載 安裝Nexus–>配置環境,啟動伺服器(請自行百度,本文略) 修改localhost為電腦的ip (

Android專案架構業務元件

前言: 從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的盤,插在哪裡都

Android元件元件通訊

Demo地址:https://github.com/751496032/ComponentDemo 本文是續上一篇Android元件化方案實踐與思考文章一些思考,主要是針對元件間通訊,比如: 每個元件如何初始化各自的資料 Activity間如何跳轉、Fragment例項

我所理解的Android元件通訊機制

之前寫過一篇關於Android元件化的文章,《Android元件化框架設計與實踐》,之前沒看過的小夥伴可以先點選閱讀。那篇文章是從實戰中進行總結得來,是公司的一個真實專案進行元件化架構改造,粒度會分的更粗些,是對整體架構實踐進行相應的總結,裡面說了要打造一個元件化框架的話,需要從以下7個方面入手: 程式碼解

Android StudioGradleGradle外掛的區別

什麼是Gradle?什麼是Gradle外掛?Gradle           對應:gradle-wrapper.properties中的distributionUrl=https/://services.gradle.org/distribut

Android 元件開發原理配置

在Application的不斷髮展過程中,我們開發者要不斷地增加新特性。更多的程式碼就意味著更長的build時間和更長的增量build時間。在工程較大的專案中,build時間要佔到10%~15%的工作時間。這不僅是浪費時間,也是測試驅動工作方式(TDD)比較困難的原因。

Android 元件路 路由設計

基於公司業務發展,公司的APP需求不斷增加,應用也略顯“臃腫”。想著趁現在不那麼“糟糕”,時間也比較寬裕,把專案結構整整,因而走上了元件化之路。 模組化 VS 元件化 模組化: 將一個程式按照其功能做拆分,分成相互獨立的模組,以便於每個模組只包含與其功能

Android元件終極方案

Fragment或View如何支援元件化 距離 Android元件化方案 釋出已經半年有餘,雖說這個方案已經能夠解決一些專案的需求,但是依然不夠完美。很多開發者也在部落格和GitHub中留言甚至發郵件問我,Fragment怎麼辦?