前言:
公司的業務元件化推進的已經差不多三四個月的時間了,各個業務元件之間的解耦工作已經基本完成,各個業務元件以module的形式存在專案中,然後專案依賴本地的module,多少有點不太利於專案的並行開發維護了,本質原因就是如果是依賴本地的,必須要將依賴的module和主工程放在一個project裡面,這就導致了每個project都需要配置這些依賴關係,如果是公司內多個工程依賴同一個公司內部的業務元件,業務元件有更新時,同步非常麻煩,但公司內部的業務元件不可能部署到公有maven伺服器上,所以有必要搭建一個區域網內的maven伺服器,方便管理公司內部的公共庫及業務元件,通過查閱資料和技術預研確定採用Gradle和Sonatype Nexus搭建私有maven倉庫的方式,今天總結一下如何搭建整套整合環境及簡單的使用。下圖簡單示例一下現在的專案結構:
業務元件化相關部落格:
- Android業務元件化之現狀分析與探討
- Android業務元件化之URL Scheme使用
- Android業務元件化之子模組SubModule的拆分以及它們之間的路由Router實現
- Android業務元件化之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倉庫,重新整理一下有助於我記錄整個業務元件化的過程與心得,所以一邊看一邊搭建一邊嘗試。