maven
插件已經過時,官方推薦使用這個插件來實現將我們的代碼發布到 Apache Maven倉庫的功能。
依賴
plugins {
id 'maven-publish'
}
基礎概念
任務 Tasks
所有以下任務都歸在名為publishing
類型為PublishingExtension
的擴展下。
-
generatePomFileForPubNamePublication:為名為
PubName
的發布創建一個POM文件,填充已知元數據,如項目名稱、項目版本和依賴項。生成的POM文件默認放在*build/publications/$pubName/pom-default.xml*.
- **publishPubNamePublicationToRepoNameRepository **:將名為
PubName
的發布發布到名為RepoName
的存儲庫中。如果您有一個沒有顯式名稱的存儲庫定義,那么RepoName
將是Maven
。 - **publishPubNamePublicationToMavenLocal **:將
PubName
發布復制到本地Maven緩存—通常是*$USER_HOME/.m2/repository*
——連同發布的POM文件和其他元數據一起。 -
publish:依賴于所有
publishPubNamePublicationToRepoNameRepository
任務。將所有已定義的發布發布到所有已定義存儲庫的聚合任務。它不包括將發布復制到本地Maven緩存。 -
publishToMavenLocal:依賴于所有
publishPubNamePublicationToMavenLocal
任務。將所有已定義的發布復制到本地Maven緩存,包括它們的元數據(POM文件等)。
發布 Publications
Maven 發布中的配置主要有四種:
- 一個component - 通過 MavenPublication.from(org.gradle.api.component.SoftwareComponent)配置
- Custom artifacts — 通過 MavenPublication.artifact(java.lang.Object) 方法配置。查看MavenArtifact 獲取所有可配置選項。
- 標準元數據,例如
artifactId
,groupId
andversion
. - POM文件的其他內容 — 通過 MavenPublication.pom(org.gradle.api.Action)配置
倉庫 Repositories
publishing {
repositories {
maven {
// 基于版本名稱選擇不同的倉庫地址
def releasesRepoUrl = "$buildDir/repos/releases"
def snapshotsRepoUrl = "$buildDir/repos/snapshots"
// url是必須要配置的
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
// 倉庫用戶名密碼
credentials {
username = "root"
password = "root"
}
}
}
}
完整例子
apply plugin: 'maven-publish'
task generateSourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier 'sources'
}
def versionName = "2.7.0-SNAPSHOT"
publishing {
publications {
Production(MavenPublication) {
// 使用方引用 implementation 'cn.com.jack:mavendemo:2.7.0-SNAPSHOT'
groupId = "cn.com.jack"
artifactId = "mavendemo"
version = versionName
// 依賴 bundleReleaseAar 任務,并上傳其產出的aar
afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
// 也可以指定上傳的AAR包,但是需要先手動生成aar
// artifact("$buildDir/outputs/aar/${project.getName()}-debug.aar")
// 上傳source,這樣使用放可以看到方法注釋
artifact generateSourcesJar
// pom文件中聲明依賴,從而傳遞到使用方
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.each {
// 避免出現空節點或 artifactId=unspecified 的節點
if (it.group != null && (it.name != null && "unspecified" != it.name) && it.version != null) {
println it.toString()
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
dependencyNode.appendNode('scope', 'implementation')
}
}
}
}
}
repositories {
// 定義一個 maven 倉庫
maven {
// 可以有且僅有一個倉庫不指定 name 屬性,會隱式設置為 Maven
// 根據 versionName 來判斷倉庫地址
url = versionName.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL
// 倉庫用戶名密碼
credentials {
username = "shine"
password = "shine"
}
}
// 定義第二個 maven 倉庫,名為 Nexus
maven {
// 必須顯示指定 name
name = "nexus"
url = versionName.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL
}
}
}
在Gradle Tool Window
中會生成對應的任務,如下圖所示:
image
你可以在
Gradle Tool Window
中執行發布任務,也可以使用命令的方式./gradlew clean build publish
需要注意的是使用
maven
插件時,生成的.pom
文件中包括所有的依賴,從而保證使用方能夠獲取所有依賴。但是maven-publish
插件生成的.pom
文件并不包含依賴,所以我們通過pom.withXml
增加了依賴。
Android Gradle 插件 3.6.0使用更簡便方式
Android Gradle 插件 3.6.0 及更高版本(說的是這里 classpath 'com.android.tools.build:gradle:3.6.0'
)支持 Maven Publish Gradle 插件,可讓您將構建工件發布到 Apache Maven 代碼庫。Android Gradle 插件會為應用或庫模塊中的每個構建變體工件創建一個組件,您可以使用它來自定義要發布到 Maven 代碼庫的發布內容。
Android 插件所創建的組件取決于模塊是否使用應用或庫插件,如下表所述。
Android Gradle 插件 | 發布內容工件 | 組件名稱 |
---|---|---|
com.android.library |
AAR | components.variant |
com.android.application |
APK 和可用的 ProGuard 或 R8 映射文件的 ZIP | components.variant_apk |
com.android.application |
Android App Bundle (AAB) | components.variant_aab |
所以我們上面的例子就成了下面這樣
apply plugin: 'maven-publish'
task generateSourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier 'sources'
}
def versionName = "2.7.0-SNAPSHOT"
afterEvaluate {
publishing {
publications {
Production(MavenPublication) {
from components.release
// 使用方引用 implementation 'cn.com.jack:mavendemo:2.7.0-SNAPSHOT'
groupId = "cn.com.jack"
artifactId = "mavendemo"
version = versionName
// 上傳source,這樣使用放可以看到方法注釋
artifact generateSourcesJar
}
}
repositories {
// 定義一個 maven 倉庫
maven {
// 可以有且僅有一個倉庫不指定 name 屬性,會隱式設置為 Maven
// 根據 versionName 來判斷倉庫地址
url = versionName.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL
// 倉庫用戶名密碼
credentials {
username = "shine"
password = "shine"
}
}
// 定義第二個 maven 倉庫,名為 Nexus
maven {
// 必須顯示指定 name
name = "nexus"
url = versionName.endsWith('SNAPSHOT') ? SNAPSHOT_REPOSITORY_URL : RELEASE_REPOSITORY_URL
}
}
}
}