使用 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 官方文档