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
中会生成对应的任务,如下图所示:
你可以在
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
}
}
}
}