?在組件化項(xiàng)目架構(gòu)中每個(gè)組件管理我們一般使用分倉(cāng)庫(kù)管理类缤,每個(gè)組件分別打包成aar包引入項(xiàng)目依賴(lài)手素。老版本 gradle 我們一般使用 maven 插件來(lái)上傳aar包,而 Gradle 6.x 版本更新了上傳插件為 maven-publish
# 低版本使用
apply plugin: 'maven'
# 6.X 以上版本變化
apply plugin: 'maven-publish'
復(fù)制代碼
如何生成 aar 包
Android Gradle 插件有兩種筋量,一個(gè)Application湖苞,一個(gè)是library拯欧,Android 插件所創(chuàng)建的組件取決于模塊是否使用應(yīng)用或庫(kù)插件,而library模塊編譯生成的產(chǎn)物就是 aar 包财骨,如下官方文檔描述官方文檔描述
可以在 library 組件下執(zhí)行assemble來(lái)生成 aar 包镐作,輸出目錄為++build/outputs/aar++,如下圖所示
aar 包上傳本地倉(cāng)庫(kù)
Gradle 6.0以下 maven 插件
直接使用 maven 測(cè)試發(fā)布在本項(xiàng)目目錄中創(chuàng)建本地倉(cāng)庫(kù)目錄
// maven-upload.gradle
apply plugin: 'maven'
group='com.mao.testmavenpush'
version='1.0.0'
uploadArchives {
? ? repositories {
? ? ? ? mavenDeployer {
? ? ? ? ? ? //在本項(xiàng)目目錄下創(chuàng)建的Maven倉(cāng)庫(kù)設(shè)置
? ? ? ? ? ? repository(url: uri('../local_test_repo'))
? ? ? ? }
? ? }
}
復(fù)制代碼
Gradle 7.0 maven-publish 插件
為了方便測(cè)試隆箩,我們可以吧 aar 包上傳到本地創(chuàng)建的倉(cāng)庫(kù)文件夾该贾,如下創(chuàng)建一個(gè) gradle 上傳本地腳本 maven-push.gradle,在本地 E 盤(pán)創(chuàng)建一個(gè) maventestrepository 本地倉(cāng)庫(kù)文件夾
// maven-push.gradle
apply plugin: 'maven-publish'
afterEvaluate {
? ? publishing {
? ? ? ? //發(fā)布的 jar 包配置
? ? ? ? publications {
? ? ? ? ? ? release(MavenPublication) {
? ? ? ? ? ? ? ? groupId = 'com.mao.testmavenpush'
? ? ? ? ? ? ? ? artifactId = 'maven-push-test'
? ? ? ? ? ? ? ? version = '1.0.0'
? ? ? ? ? ? ? ? //aar 文件
? ? ? ? ? ? ? ? def projectName = project.getName()
? ? ? ? ? ? ? ? artifact "build/outputs/aar/${projectName}-release.aar"
? ? ? ? ? ? ? ? pom.withXml{
? ? ? ? ? ? ? ? ? ? def dependenciesNode = asNode().appendNode("dependencies")
? ? ? ? ? ? ? ? ? ? configurations.implementation.allDependencies.forEach(){
? ? ? ? ? ? ? ? ? ? ? ? Dependency dependency ->
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (dependency.version != "unspecified" && dependency.name != "unspecified"){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? def dependencyNode = dependenciesNode.appendNode('dependency')
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('groupId', dependency.group)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('artifactId', dependency.name)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('version', dependency.version)
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //倉(cāng)庫(kù)地址配置
? ? ? ? repositories {
? ? ? ? ? ? maven {
? ? ? ? ? ? ? ? // test, upload local maven repository
? ? ? ? ? ? ? ? //url = "file:" + new File(project.rootProject.rootDir, "local_test_repo").path
? ? ? ? ? ? ? ? url = "file://d:/hhd"
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
復(fù)制代碼
在組件Module的 build.gradle 使用這個(gè)腳本
apply from: 'maven-push.gradle'
復(fù)制代碼
隨后會(huì)有對(duì)應(yīng)的Task自動(dòng)生成
? 如看不見(jiàn)Task? 參考Demo 中??TaskShow.png
? ? ? ? 位置: AndroidStudioMaven\AndroidStudioMaven\app\src\main\res\drawable\TaskShow.png
執(zhí)行Gradle Task publish 后等待任務(wù)執(zhí)行完本地倉(cāng)庫(kù)aar發(fā)布成功
Nexus 私服發(fā)布 aar 包
和本地倉(cāng)庫(kù)差不多捌臊,Nexus 私服也是本地倉(cāng)庫(kù)杨蛋,只不過(guò)是部署在內(nèi)部服務(wù)器上,同理理澎,編寫(xiě)一個(gè)repo-maven-push.gradle 腳本逞力,
apply plugin: 'maven-publish'
def GroupId = 'com.mao.testmavenpush'
def ArtifactId = 'maven-push-test'
def Version = '1.0.1'
def userName = "xxxx"
def passWord = "xxxx"
def releasesRepoUrl = "http://xxx.xxx.116.12:9190/repository/maven-releases/"
task generateSourcesJar(type:Jar){
? ? from android.sourceSets.main.java.srcDirs
? ? classifier "sources"
}
afterEvaluate {
? ? publishing {
? ? ? ? //發(fā)布的 arr 包配置
? ? ? ? publications{
? ? ? ? ? ? //名字可以自己指定,如果有多渠道糠爬,整段多復(fù)制一個(gè)
? ? ? ? ? ? release(MavenPublication){
? ? ? ? ? ? ? ? groupId = GroupId//公司域名
? ? ? ? ? ? ? ? artifactId = ArtifactId//該aar包的名稱(chēng)
? ? ? ? ? ? ? ? version = Version//版本號(hào)
? ? ? ? ? ? ? ? // 必須有這個(gè) 否則不會(huì)上傳AAR包
? ? ? ? ? ? ? ? afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
? ? ? ? ? ? ? ? // 多渠道寇荧,可以自行指定aar路徑
? ? ? ? ? ? ? ? // def projectName = project.getName()
? ? ? ? ? ? ? ? // artifact "build/outputs/aar/${projectName}-release.aar"
? ? ? ? ? ? ? ? // 上傳source,這樣使用方可以看到方法注釋
? ? ? ? ? ? ? ? artifact generateSourcesJar
? ? ? ? ? ? ? ? //依賴(lài)關(guān)系
? ? ? ? ? ? ? ? pom.withXml{
? ? ? ? ? ? ? ? ? ? def dependenciesNode = asNode().appendNode("dependencies")
? ? ? ? ? ? ? ? ? ? configurations.implementation.allDependencies.forEach(){
? ? ? ? ? ? ? ? ? ? ? ? Dependency dependency ->
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (dependency.version != "unspecified" && dependency.name != "unspecified"){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? def dependencyNode = dependenciesNode.appendNode('dependency')
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('groupId', dependency.group)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('artifactId', dependency.name)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dependencyNode.appendNode('version', dependency.version)
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? ? //倉(cāng)庫(kù)地址配置
? ? ? ? repositories {
? ? ? ? ? ? maven {
? ? ? ? ? ? ? ? //允許使用 http
? ? ? ? ? ? ? ? allowInsecureProtocol = true
? ? ? ? ? ? ? ? url = releasesRepoUrl
? ? ? ? ? ? ? ? credentials {
? ? ? ? ? ? ? ? ? ? username = userName
? ? ? ? ? ? ? ? ? ? password = passWord
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
復(fù)制代碼
由以上腳本执隧,可以知道揩抡,和發(fā)布到本地倉(cāng)庫(kù)其實(shí)沒(méi)什么區(qū)別户侥,也就是改變上傳地址罷了,但是這里會(huì)有一個(gè)坑峦嗤,默認(rèn)需要私服地址為 Https蕊唐,想要使用 Http 則需要添加allowInsecureProtocol設(shè)置,官方文檔描述
同理執(zhí)行 Gradle Task publish 發(fā)布到 Nexus 私服
依賴(lài)使用發(fā)布Nexus私服aar包
要發(fā)布到 Nexus私服烁设,首先需要自己搭建一個(gè)Nexus私服刃泌,可看我以前文章Centos下 Nexus 3.x 搭建Maven 私服
在Gradle設(shè)置私服maven地址,同理也需要配置允許使用http署尤,否則 sync 同步報(bào)錯(cuò)
allprojects {
? ? repositories {
? ? ? ? ......
? ? ? ? //本地 maven 私服
? ? ? ? maven {
? ? ? ? ? ? //允許使用 http
? ? ? ? ? ? allowInsecureProtocol = true
? ? ? ? ? ? url = "http://xxx.xxx.116.12:9190/repository/maven-public/" }
? ? }
}
復(fù)制代碼
工程中依賴(lài)使用,接下來(lái)就可以愉快的玩耍了
dependencies {
? ? .....
? ? //測(cè)試 aar 引入
? ? implementation 'com.mao.testmavenpush:maven-push-test:1.0.1'
}
復(fù)制代碼
測(cè)試發(fā)布項(xiàng)目Demo地址?