Android:发布aar到maven仓库,使用maven-publish插件

maven插件与maven-publish插件的区别

maven插件适用于gradle1.0-6.2版本,6.2版本后该插件就被废弃了,推荐使用maven-publish插件。

maven-publis插件是在gradle 1.3 版本后开始支持的,使配置更加简洁。

maven-publis插件的使用

应用插件

groovy 复制代码
apply plugin: "maven-publish"

基础配置

配置发布的代码,基础配置信息:

groovy 复制代码
publishing {
    // 配置maven 仓库
    repositories { RepositoryHandler handler->
        handler.mavenLocal()  // 发布到默认的本地maven仓库(USER_HOME/.m2/repository/)
    }
    // 配置发布产物
    publications {PublicationContainer publication->
      // 任务名称:maven   (名称可以随便定义)
        maven(MavenPublication) {// 容器可配置的信息(不能少) MavenPublication
            // 依赖 bundleReleaseAar 任务,并上传其产出的aar
            afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) } // 方式一:生成aar包
        	  // artifact "$buildDir/outputs/aar/${project.name}-release.aar" // 方式二:指定生成的aar路径
            groupId = "com.hww.rumeng"
            artifactId = "testJ"
            version = "1.0.2-SNAPSHOT"
        }
    }
}

publish

publishing 是一个用于配置项目发布(Publishing)相关信息的部分,可以配置的信息有两个:repositories publications

publish.repositories

  • repositories 用于配置maven仓库地址。
groovy 复制代码
repositories { RepositoryHandler handler ->
    handler.mavenLocal()//默认本地maven仓库地址
    handler.maven {
        url "${rootDir}/repo"  //指定本地maven仓库地址
    }
    // 仓库用户名密码
    // handler.maven { MavenArtifactRepository mavenArtifactRepository ->
    //     // maven 仓库地址
    //     url 'http://10.0.0.10:8082/repository/core/'
    //     // 访问仓库的 账号和密码
    //     credentials {
    //         username = "testUser"
    //         password = "123456"
    //     }
    // }
}

publish.publications

  • publications 配置需要发布的jar的信息,即aar包的信息。 publications 是一个容器,类型是 PublicationContainer ,其可以配置的信息类型是 MavenPublication。即 可以理解成 publications 是一个列表集合,而集合中存储的对象是 MavenPublication,而对象的名称可以由自己随便定义。 所以 publications 也是可以配置多个的,如:
groovy 复制代码
publications { PublicationContainer publicationContainer ->
  // 发布 snapshot 包
    debug(MavenPublication) {
        afterEvaluate { artifact(tasks.getByName("bundleDebugAar")) }
        groupId = "com.hww.rumeng"
        artifactId = "testJ"
        version = "1.0.2-SNAPSHOT"
    }
  // 发布正式包
    release(MavenPublication) {
        afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
        groupId = "com.hww.rumeng"
        artifactId = "testJ"
        version = "1.0.2-SNAPSHOT"
    }
}

上传指定aar包的方式:

  1. 通过依赖生成aar包任务,如: afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
  2. 通过指定生成的aar路径,如: artifact "$buildDir/outputs/aar/${project.name}-release.aar"

上传源码

在maven-publish插件的基础使用中是不包含上传aar包的源码。

增加上传源码的task,如:

groovy 复制代码
// 增加上传源码的task
task sourceJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    archiveClassifier = "sources"
}

publishing {
    repositories { RepositoryHandler handler ->
        handler.mavenLocal()
    }
    publications { PublicationContainer publicationContainer ->
        maven(MavenPublication) {
            artifact sourceJar // 增加上传源码的 task 
          
            afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
            groupId = "com.hww.rumeng"
            artifactId = "testJ"
            version = "1.0.2-SNAPSHOT"
        }
    }
}

增加上面的task后,源码能上传,注释也是能看到的。

依赖传递

经过基础与上传源码后,是能正常依赖与使用的,但是aar包原本依赖的一下第三方包是不会自动依赖,需要手动添加依赖。

把library中的依赖信息,手动添加到 pom 文件中,就可以完成依赖传递,如下:

groovy 复制代码
maven(MavenPublication) {
    // 依赖 bundleReleaseAar 任务,并上传其产出的aar
    afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
    artifact sourceJar
    groupId = "com.hww.rumeng"
    artifactId = "testJ"
    version = "1.0.2-SNAPSHOT"
    // 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 "dependency=${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')
            }
        }
    }
}

上传kotlin项目的aar包,源码上传问题

通过 android.sourceSets.main.java.srcDirs 指定的源码,只能识别到 Java 文件,而 kt 文件被忽略了,但 通过查看官方文档可以知道,from 函数是可以指定源码路径的,所以这里直接把 from 函数的参数替换为 源码路径,如以下代码

groovy 复制代码
task sourceJar(type: Jar) {
    from android.sourceSets.main.java.getSrcDirs() // 源码路径
    archiveClassifier = "sources"
}

如此修改后,发布的aar包也是能正常访问源码的

相关推荐
HarrySunCn7 小时前
如何使用VSCode开发Arduino项目
ide·vscode·单片机·编辑器
知青先生9 小时前
E9项目调试方式
java·ide
Aspect of twilight15 小时前
vscode python debug方式
ide·vscode·python·debug
我又来搬代码了15 小时前
【Android】【Compose】Compose知识点复习(一)
android·前端·kotlin·android studio
Aevget15 小时前
.NET跨平台开发工具Rider v2025.3发布——支持.NET 10
ide·.net·开发工具·rider·rider v2025.3
计算机毕设指导615 小时前
基于微信小程序的积分制零食自选平台【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
啃火龙果的兔子16 小时前
vscode中可以使用的免费的AI编程工具有哪些
ide·vscode·ai编程
宋明炜17 小时前
VSCode + MSYS2 配置 C 语言开发环境(详细步骤)
c语言·ide·vscode
正经教主18 小时前
【Trae+AI】和Trae学习搭建App_1.2:第2章·App开发环境配置
android·学习·android studio
silence25018 小时前
Maven Central 上传(发布)JAR 包流程
java·maven·jar