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包也是能正常访问源码的

相关推荐
叶羽西7 小时前
Android Studio打开一个外部的Android app程序
android·ide·android studio
天使day10 小时前
Maven
java·maven
odng15 小时前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
smile-yan16 小时前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
果冻的猿宇宙17 小时前
Maven 中央仓库访问过慢的解决方案--设置国内镜像
maven·镜像·仓库·aliyun·国内镜像·mirror
weixin_4231961717 小时前
VSCode+WSL作为IDE开发和管理深度学习项目
ide·vscode·编辑器
哆啦 AI 梦17 小时前
【Maven】如何解决Maven循环依赖?
maven·循环依赖
Earnest~17 小时前
Maven极简安装&配置-241223
java·maven
皮蛋很白17 小时前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea
乐闻x17 小时前
VSCode 插件开发实战(八):创建和管理任务 Task
ide·vscode·编辑器