Android 库Maven上传 Gradle 配置模板

使用 maven-publish 插件发布库模块时的 gradle 配置模板。包括本地仓库及maven 中心仓库,支持发布javadoc及source.

maven-publish 插件简要说明

配置及任务生成规则

maven-publish 可以帮助我们把 publication 发布到 repository 中。配置时的主体结构如下:

publishing {
    publications {
    	testSdk(MavenPublication){ 
    	}
    	// 可以添加多个
    }
	repositories {
		maven {
	        name = "localRepo"
	    }
	    // 可以添加多个
	}
}

其中:

  • publications 用于配置我们的产物,即需要发布的东西:如 jar,aar 等
  • repositories 用于配置我们需要发布到的目的地,如maven中心仓库,自建nexus maven仓库,本地目录,mavenLocal本地仓库等。

配置解析完成后,maven-publish 插件会组合 publication 和 repository 生成对应的 gradle任务,命名结构如下 publish{Publication}To{Repository}Repository,如我们上面的配置会生成名为: publishTestSdkToLocalRepoRepository 的任务。

同时,还会生成一系列 publish{Publication}ToMavenLocal 的任务,执行此任务可以将产物推送到 MavenLocal 仓库中(默认位于 $USER_HOME/.m2/repository 中)。

本地 AAR/JAR publish 配置模板

对于如下情况,我们可能需要将本地的AAR或者jar产物手动发布到本地Maven仓库,

  • 如: aar 或 jar 的库来源于第三方,对方并为提供maven仓库方式进行引用,但是我们为了方便管理,手动将其发布到maven中,然后在项目中引入。

如下两种配置中,我们都会定义一个项目内部的maven仓库目录,位于根目录下 local-maven-repo/release 目录。

基础配置模板

apply plugin: 'maven-publish'

publishing {
    publications {
           // testSdk 替换为自己的,名称随便取,会拼接到publish任务名称中
           testSdk(MavenPublication) {
                // 替换 groupId
                groupId "com.github.hanlyjiang"
                //  替换 artifactId 
                artifactId "testsdk"
                // 替换 version
                version "0.0.1"
                // jar / aar
                artifact file("./libs/testsdk-0.0.1.jar")
                // 
                // javadoc (如果有则配置,文件需要javadoc位于压缩文件的根目录)
                artifact(file("./libs/testsdk-javadoc.zip")) {
                    classifier "javadoc"
                    extension "jar"
                }
                // 源码(如果有)
                artifact(file("./libs/testsdk-sources.zip")) {
                     classifier "source"
                     extension "jar"
                }
                pom {
                    name = "testsdk"
                    description = "test sdk for maven upload"
                }
        	}
    	}
	     repositories {
	        maven {
	            name = "ProjectLocalRelease"
	            url = new File(rootProject.rootDir, "local-maven-repo${File.separator}release")
	        }
	    }
    }

aar/jar数量较多时配置模板

apply plugin: 'maven-publish'

class LocalArtifact {
    String deps;
    String artifactFile;
    String sourceFile;
    String javaDocFile;

    LocalArtifact(String deps, String artifactFile, String sourceFile, String javaDocFile) {
        this.deps = deps
        this.sourceFile = sourceFile
        this.artifactFile = artifactFile
        this.javaDocFile = javaDocFile
    }

    String groupId() {
        return deps.split(":")[0]
    }

    String artifactId() {
        return deps.split(":")[1]
    }

    String version() {
        return deps.split(":")[2]
    }
}

def publicationList = new ArrayList<>()
//   此处添加多个产物
publicationList.add(new  LocalArtifact("com.github.hanlyjiang:testsdk:0.0.1","./libs/testsdk-0.0.1.jar","./libs/testsdk-sources.zip","./libs/testsdk-javadoc.zip"));

publishing {
    publications {
        publicationList.forEach { localArtifact ->
            "${localArtifact.artifactId()}"(MavenPublication) {
                groupId localArtifact.groupId()
                artifactId localArtifact.artifactId()
                version localArtifact.version()
                // jar / aar
                artifact file(localArtifact.artifactFile)
                // https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html#org.gradle.api.publish.maven.MavenPublication:artifact(java.lang.Object,%20org.gradle.api.Action)
                // javadoc
                if (localArtifact.javaDocFile != null) {
                    artifact(file(localArtifact.javaDocFile)) {
                        classifier "javadoc"
                        extension "jar"
                    }
                }
                // 源码
                if (localArtifact.sourceFile != null) {
                    artifact(file(localArtifact.sourceFile)) {
                        classifier "source"
                    }
                }
                pom {
                    name = localArtifact.artifactId()
                    description = localArtifact.artifactId()
                }
            }
        }
    }

    repositories {
        maven {
            name = "ProjectLocalRelease"
            url = new File(rootProject.rootDir, "local-maven-repo${File.separator}release")
        }
    }
}
task("a-printDeps") {
    group = "publishing"
    doLast {
        publicationList.forEach { artifact ->
            logger.lifecycle(artifact.deps)
        }
    }
}
task("a-cleanLocalRepo", type: Delete) {
    group = "publishing"
    delete rootProject.file("local-maven-repo")
}

Maven中心仓库说明

maven 中心仓库上传时,会做一系列的检查,会比自建仓库及本地目录对于pom信息完整度的检查比较严格,同时还需要给产物进行签名,否则无法通过maven中心仓库服务器的门禁检测。发布到Maven 中心仓库的配置直接参考: 如何发布Android库到Maven中心仓库

参考: Gradle 官方文档

你可能感兴趣的:(gradle,maven,android)