Android基础-Maven Publish Plugin

1,402 阅读2分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

简介

“maven-publish” 插件提供了发布Maven格式的功能。

“publishing” 插件创建一个类型为PublishingExtension名称为publishing的参数,这个参数里面提供了publications容器和repositories容器。”maven-publish” 依赖的是MavenPublication和MavenArtifactRepository。

引入插件

plugins {
    id 'maven-publish'
}

Publications

描述一次发布的结构和配置,通过任务发布的仓库。

发布一个模块

目前支持的模块

NameProvided ByAtfifacts
javaJava Pluginjar file
webWar Pluginwar file

例子,构建内容和运行的依赖都来自Java插件

// build.gradle
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

from components.java 表示使用默认配置,生成jar文件

发布一个自定义构建内容

通过配置artifact明确的制定需要生成的内容,对于每一个自定义的构建内容,可以制定扩展名和分析信息(classifier),插件自身可以支持发布出去生成的文件是jar和war,但是这并不能满足所有的情况,所以可以自定义构建内容,比如:aar等等。怎么自定义呢?创建相应的任务以及在publications中使用artifact就可以了。

//没看懂

可以在artifact中指定要发布的文件的路径

// build.gradle
publishing {
    publications {
        maven(MavenPublication) {
            artifact "$buildDir/outputs/aar/module_rent-debug.aar"//工程打包生成的aar
        }
    }
}

POM属性

生成的POM文件的值包含了如下的属性:

  • groupId Project.getGroup()
  • artifactId Project.getName()
  • version Project.getVersion()
// build.gradle
publishing {
    publications {
        maven(MavenPublication) {
            groupId 'org.gradle.sample'
            artifactId 'project1-sample'
            version '1.1'

            from components.java
        }
    }
}

修改生成的POM文件

// build.gradle
publications {
    mavenCustom(MavenPublication) {
        pom.withXml {
            asNode().appendNode('description',
                                'A demonstration of maven POM customization')
        }
    }
}

上面例子在生成的POM文件中增加了一个description元素。使用hook可以修改POM中任意的元素。例如:你可以将依赖关系的版本范围替换成生成构建的实际版本。

可以修改POM中的任意元素,这也意味着可以将POM修改成非法的POM,所以需要小心的使用这个功能。

发布模块的唯一标识属性(groupId,artifactId,version)是一个例外,这个元素不能通过withXMLhook来修改。

发布多个模块

task apiJar(type: Jar) {
    baseName "publishing-api"
    from sourceSets.main.output
    exclude '**/impl/**'
}

publishing {
    publications {
        impl(MavenPublication) {
            groupId 'org.gradle.sample.impl'
            artifactId 'project2-impl'
            version '2.3'

            from components.java
        }
        api(MavenPublication) {
            groupId 'org.gradle.sample'
            artifactId 'project2-api'
            version '2'

            artifact apiJar
        }
    }
}

如果一个工程定义了多个发布信息,Gradle会将每一个发布信息发布到指定的仓库。每一个发布需要给定一个唯一的标示。

Repositories

发布信息(Publications)最终会发布到仓库,发布的仓库信息定义在PublishingExtension.getRepositories()中。

// build.gradle
publishing {
    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url "$buildDir/repo"
        }
    }
}

发布到maven仓库的例子

// build.gradle
apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'org.gradle.sample'
version = '1.0'

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}
publishing {
    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url "$buildDir/repo"
        }
    }
}

打包android library到本地的例子

// android-artifacts.gradle
apply plugin: "maven-publish"

task androidJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
    classpath += files(ext.androidJar)
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}

afterEvaluate { project ->
    tasks.all { Task task ->
        if (task.name.equalsIgnoreCase('publishPatchLibPublicationToMavenLocal')) {
            task.dependsOn tasks.getByName('assemble')
        }
    }
}

publishing {
    publications {
        PatchLib(MavenPublication) {

            artifactId project.getName()
            groupId group
            version version

            // artifact 打成aar
            artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
            artifact androidJavadocsJar
        }
    }
}
// publish«PUBNAME»PublicationToMavenLocal
task pushlishLibToLocal(dependsOn: ['build', 'publish PatchLibPublicationToMavenLocal']) {
    group = 'patch'
}

\

\

完整的例子

1.在module配置了多个渠道

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        
    //配置多个渠道
    productFlavors {
        cqtest {
            dimension = "full"
        }
        pre {
            dimension = "full"

        }
        dev {
            dimension = "full"
        }
    }
}

在module的build.gradle同级创建maven_push.gradle,添加如下内容:

apply plugin: 'maven-publish'

publishing {
    publications {
        //重庆测试环境
        cqtest(MavenPublication) {//cqtest即为渠道的名称,可以随意取
            groupId = 'cn.companyname'//公司域名
            artifactId = 'lib-mycar-cqtest'//该aar包的名称
            version = '1.0.6'//版本号
            def projectName = project.getName()
            artifact "build/outputs/aar/mycar-cqtest-release.aar"//对应该渠道打包出来的aar所在的目录(如何打包请往下看)
            pom.withXml{
                def dependenciesNode = asNode().appendNode("dependencies")
                configurations.implementation.allDependencies.forEach(){
                    Dependency dependency ->
                        if (dependency.version != "unspecified" && dependency.name != "unspecified"){
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', dependency.group)
                            dependencyNode.appendNode('artifactId', dependency.name)
                            dependencyNode.appendNode('version', dependency.version)
                        }
                }
            }
        }

        //开发环境
        dev(MavenPublication) {
            groupId = 'cn.companyname'
            artifactId = 'lib-mycar-dev'
            version = '1.0.6'
            def projectName = project.getName()
            artifact "build/outputs/aar/mycar-dev-release.aar"
            pom.withXml{
                def dependenciesNode = asNode().appendNode("dependencies")
                configurations.implementation.allDependencies.forEach(){
                    Dependency dependency ->
                        if (dependency.version != "unspecified" && dependency.name != "unspecified"){
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', dependency.group)
                            dependencyNode.appendNode('artifactId', dependency.name)
                            dependencyNode.appendNode('version', dependency.version)
                        }
                }
            }
        }

        //预发布环境
        pre(MavenPublication) {
            groupId = 'cn.companyname'
            artifactId = 'lib-mycar-pre'
            version = '1.0.6'
            def projectName = project.getName()
            artifact "build/outputs/aar/mycar-pre-release.aar"
            pom.withXml{
                def dependenciesNode = asNode().appendNode("dependencies")
                configurations.implementation.allDependencies.forEach(){
                    Dependency dependency ->
                        if (dependency.version != "unspecified" && dependency.name != "unspecified"){
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', dependency.group)
                            dependencyNode.appendNode('artifactId', dependency.name)
                            dependencyNode.appendNode('version', dependency.version)
                        }
                }
            }
        }
    }
    repositories {
        maven {
        	//maven仓库的地址
			url = "http://nexus.isuanyun.com/repository/maven-public/"
			//仓库的用户名及密码
              credentials {
                  username ''
                 password ''
              }
             //👇这是一个本地仓库地址即D盘的maventestrepository文件夹,可以用来测试发布aar包,发布之后的aar将存放于该地址
            //url = "file://d:/maventestrepository"
        }
    }
}

在build.gradle中添加如下内容

apply from: 'maven_push.gradl'

\