Gradle插件之maven-publish:发布android library到maven仓库

本文深入探讨MavenPublish插件的使用方法,包括如何配置发布到Maven仓库的细节,如POM文件生成、发布任务、依赖声明及仓库设置。同时介绍了Android Gradle插件3.6.0以上版本如何简化发布流程。

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 发布中的配置主要有四种:

仓库 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.libraryAARcomponents.variant
com.android.applicationAPK 和可用的 ProGuard 或 R8 映射文件的 ZIPcomponents.variant_apk
com.android.applicationAndroid 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
            }
        }
    }
}

参考

官方文档 Maven Publish Plugin

使用 Maven Publish 插件

Publish an Android library to Maven with aar and source jar

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值