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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m-publish是一个Gradle插件,用于将本地library发布到Apache Maven仓库。通过使用该插件,我们可以将*.aar、*.jar等library发布仓库中,并通过gradle或者maven进行远程依赖使用。 要使用maven-publish插件,需要在build.gradle中声明插件,并在publishing{}块中进行配置。首先,通过在plugins{}块中添加id 'maven-publish'来声明插件。然后,在publishing{}块中,可以配置group和version属性,以及定义要发布的publication和repository。 例如,通过components.java来指定要发布library,使用mavenLocal()来指定要发布到的仓库。可以根据需要添加更多的publication和repository配置。 maven-publish插件提供了一些任务,如generatePomFileForPubNamePublication用于创建需要发布的POM文件,并填充一些已知的元数据,例如项目名称、项目版本和依赖项。publishPubNamePublicationToRepoNameRepository用于将指定publication发布到指定repository。publishPubNamePublicationToMavenLocal用于将指定publication发布复制到本地Maven缓存,包括POM文件和其他元数据。 此外,还有一些其他任务,如publish将所有定义的publication发布到所有定义的存储库的聚合任务,而publishToMavenLocal将所有定义的publication复制到本地Maven库中,包括它们的元数据。 例如,如果我们有一个名为myLibrary的publication,并将其发布mavenLocal()仓库,我们可以运行命令publishPubNamePublicationToMavenLocal来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值