一.Maven私服搭建
-
下載nexus3
地址:https://www.sonatype.com/download-oss-sonatype
windows系統(tǒng):
-
修改配置
解壓下載包到:F:\MavenCenter\nexus-3.15.2-01-win64
修改文件位置:...\nexus-3.15.2-01\etc
文件夾下nexus-default.properties
修改主機(jī)和端口配置:
-
啟動(dòng)nexus服務(wù)
在...\bin
目錄下,以管理員身份啟動(dòng)cmd- 方式一:
nexus.exe /run
命令啟動(dòng)
啟動(dòng)成功:
- 方式二:安裝nexus本地服務(wù)來啟動(dòng)(推薦)
安裝命令:nexus.exe /install nexus3
安裝成功:
啟動(dòng)nexus服務(wù):nexus.exe /start nexus3
啟動(dòng)nexus服務(wù):nexus.exe /stop nexus3
- 方式一:
4.訪問nexus私服
- 瀏覽器打開:http://127.0.0.1:8081/
-
登錄赎瞎,默認(rèn)用戶名和密碼為:admin/admin123
二.nexus倉庫
倉庫名 | 作用 |
---|---|
hosted(宿主倉庫) | 存放本公司開發(fā)的版本(正式版本毒坛、測試版本) |
proxy(代理倉庫) | 代理中央倉庫怀各、Apache庫 |
group(組倉庫) | 使用時(shí)連接組倉庫爽醋,包含Hosted(宿主倉庫)和Proxy(代理倉庫) |
virtual (虛擬倉庫) | 基本用不到齐莲,重點(diǎn)關(guān)注上面三個(gè)倉庫的使用 |
三.版本上傳
-
可以本地生成jar或者aar廷支,通過圖形化用戶界面上面
這個(gè)沒啥可說明僧界,按照界面提示上傳就行
通過gradle命令上傳
在Module的build.gradle 添加如下腳本
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = GROUP_ID
pom.artifactId = ARTIFACT_ID
pom.version = VERSION
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: USERNAME, password: PASSWORD)
}
}
}
}
然后執(zhí)行 gradlew uploadArchives
任務(wù)上傳AAR
為了方便維護(hù)饲化,這里在Module目錄新建一個(gè)腳本push.gradle
婚苹,然后將上傳Maven庫的腳本抽離到push.gradle
哪痰,最后在build.gradle
中通過apply from: push.gradle
引入搀捷。
具體代碼如下:
push.gradle:
//支持將項(xiàng)目發(fā)布到maven倉庫的插件
apply plugin: 'maven'
//支持對庫文件數(shù)字簽名的插件茂装,可以通過簽名知道文件的創(chuàng)建者怎诫,創(chuàng)建時(shí)間等信息
apply plugin: 'signing'
//聲明變量記錄上傳Maven庫地址
def repositoryUrl
//判斷發(fā)到正式庫還是snapshot庫
if (isReleaseBuild()) {
println 'Release Build'
//上傳Release私有倉庫
repositoryUrl = "http://127.0.0.1:8081/repository/maven-releases/"
} else {
println 'Debug Build'
//上傳snapshot私有倉庫
repositoryUrl = "http://127.0.0.1:8081/repository/maven-snapshots/"
}
//從項(xiàng)目gradle.properties中讀取Nexus服務(wù)器登錄用戶名
def getRepositoryUserName() {
return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
}
//讀取Nexus服務(wù)器登錄密碼
def getRepositoryPassword() {
return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""
}
//通過gradle.properties中VERSION_NAME常量判斷是否是Release版本
def isReleaseBuild() {
return !VERSION_NAME.contains("SNAPSHOT")
}
//配置階段要結(jié)束伦籍,項(xiàng)目評估完會(huì)走到這一步
afterEvaluate { project ->
//聲明上傳Maven的Task
uploadArchives {
repositories {
mavenDeployer {
//簽名POM
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
//構(gòu)件標(biāo)識符
pom.artifactId = POM_ARTIFACT_ID
//全球唯一標(biāo)識符
pom.groupId = POM_GROUP_ID
//構(gòu)件版本
pom.version = VERSION_NAME
//用戶名和密碼授權(quán)驗(yàn)證
repository(url: repositoryUrl) {
authentication(userName: getRepositoryUserName(), password: getRepositoryPassword())
}
//配置pom.xml
pom.project {
//庫名稱
name POM_NAME
//打包下載上傳的格式
packaging POM_PACKAGING
//描述信息
description POM_DESCRIPTION
//項(xiàng)目地址
url POM_URL
//scm(software configuration management)標(biāo)簽允許你配置你的代碼庫
//不用SCM可忽略蓝晒,隨意配置
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
//軟件許可證書信息
licenses {
license {
//license用于法律上的名稱
name POM_LICENCE_NAME
//官方的license正文頁面的URL
url POM_LICENCE_URL
//<!--項(xiàng)目分發(fā)的主要方式: repo,可以從Maven庫下載
//manual帖鸦, 用戶必須手動(dòng)下載和安裝依賴-->
distribution POM_LICENCE_DIST
}
}
//開發(fā)者信息
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
// 進(jìn)行數(shù)字簽名
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
// type顯示指定任務(wù)類型或任務(wù), 這里指定要執(zhí)行Javadoc這個(gè)task,這個(gè)task在gradle中已經(jīng)定義
task androidJavadocs(type: Javadoc) {
// 設(shè)置源碼所在的位置
source = android.sourceSets.main.java.sourceFiles
}
// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
// 指定文檔名稱
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
// 生成sources.jar
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
// 產(chǎn)生相關(guān)配置文件的任務(wù)
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
}
build.gradle
apply from: 'push.gradle'
gradle.properties文件:
# nexus服務(wù)器登陸時(shí)候的用戶名/密碼
NEXUS_USERNAME=admin
NEXUS_PASSWORD=admin123
# 在POM文件中使用的group ID
POM_GROUP_ID=com.limushan.test
# POM文件中指向你網(wǎng)站的地址
POM_URL=https://github.com/limushan
# SCM是指版本管理工具
POM_SCM_URL=https://github.com/
POM_SCM_CONNECTION=https://github.com/limushan
POM_SCM_DEV_CONNECTION=https://github.com/limushan
# 你的開放協(xié)議相關(guān)信息
POM_LICENCE_NAME= The Apache License, Version 2.0
POM_LICENCE_URL= http://www.apache.org/licenses/LICENSE-2.0.txt
#POM_LICENCE_URL= https://github.com/facebook/react-native/blob/master/LICENSE
#POM_LICENCE_NAME= BSD License
POM_LICENCE_DIST=repo
# 開發(fā)者的相關(guān)信息
POM_DEVELOPER_ID=limushan
POM_DEVELOPER_NAME=limushan
# 庫名稱
POM_NAME=TEST Library
# artifactId
POM_ARTIFACT_ID=test
# 庫的打包格式為aar, 常見的還有jar
POM_PACKAGING=aar
# 庫的描述,說明他是干啥的
POM_DESCRIPTION=upload maven test
# 要發(fā)布的版本好,snapshots 版本可以使用格式 1.0.0-SNAPSHOT
VERSION_NAME=1.0.0
Terminal中輸入命令gradlew uploadArchives
提示成功說明已經(jīng)上傳到了你的私庫中
看下私庫芝薇,如下表示上傳成功
四.倉庫版本使用
使用和MavenCenter庫的使用規(guī)則一樣
- 在Project的
build.gradle
配置Maven庫地址(這里可以直接使用組倉庫地址,因?yàn)榻M倉庫配置了成員包含release和snapshot兩個(gè)私庫)
allprojects {
repositories {
//...
maven {
url 'http://127.0.0.1:8081/repository/maven-public/'
}
//...
}
}
- 在module的
build.gradle
配置依賴庫
dependencies {
implementation ('com.limushan.test:test:1.0.0')
}
build下,可以看到依賴已經(jīng)加入項(xiàng)目中:五.發(fā)布到MevenCenter庫
發(fā)布到Meven 中央倉庫作儿,流程和發(fā)布到 私庫類似洛二,最后多一個(gè)發(fā)布流程
具體可參考下面的文章:發(fā)布開源項(xiàng)目到Maven 中心倉庫
六.依賴更新
項(xiàng)目依賴的相同版本遠(yuǎn)程包如果有更新,會(huì)有提醒或者自動(dòng)更新嗎攻锰?
答案是不會(huì)的晾嘶,在執(zhí)行build、compile等任務(wù)時(shí)會(huì)解析項(xiàng)目配置的依賴并按照配置的倉庫去搜尋下載這些依賴娶吞。默認(rèn)情況下垒迂,Gradle會(huì)依照Gradle緩存(默認(rèn)緩存位置:.../.gradle/caches
目錄下)->你配置的倉庫的順序依次搜尋這些依賴,并且一旦找到就會(huì)停止搜索妒蛇。如果想要忽略本地緩存每次都進(jìn)行遠(yuǎn)程檢索可以通過在執(zhí)行命令時(shí)添加--refresh-dependencies參數(shù)來強(qiáng)制刷新依賴机断。
gradlew build --refresh-dependencies
還可以通過下面的方法為緩存指定一個(gè)時(shí)效去檢查遠(yuǎn)程倉庫的依賴版本(只對SNAPSHOT(changing)和+號(dynamic)版本,默認(rèn)是24小時(shí)自動(dòng)更新绣夺。)
configurations.all {
//每隔1分鐘檢查遠(yuǎn)程依賴是否存在更新
resolutionStrategy.cacheChangingModulesFor 1, 'minutes'
// 采用動(dòng)態(tài)版本聲明的依賴緩存1分鐘
resolutionStrategy.cacheDynamicVersionsFor 1, 'minutes'
}