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

總李寫程式碼發表於2017-03-03

前言:

     公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以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

 下載地址:http://www.sonatype.org/nexus/go

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倉庫,重新整理一下有助於我記錄整個業務元件化的過程與心得,所以一邊看一邊搭建一邊嘗試。

 

相關文章