MavenPublication

A MavenPublication 是 Gradle 应如何以 Maven 格式发布内容的表示/配置。通过提供 MavenPublication 作为类型,您可以直接向项目的 publishing.publications 容器添加一个具名的 Maven 发布。

publishing {
  publications {
    myPublicationName(MavenPublication) {
      // Configure the publication here
    }
  }
}

默认的 Maven POM 标识属性映射如下:

  • groupId - project.group
  • artifactId - project.name
  • version - project.version

对于某些常见用例,通常只需指定要发布的组件即可,无需其他操作(MavenPublication.from(org.gradle.api.component.SoftwareComponent)。已发布的组件用于确定要发布哪些工件以及在生成的 POM 文件中应列出哪些依赖项。

要向发布的集合添加更多工件,请使用 MavenPublication.artifact(java.lang.Object)MavenPublication.artifact(java.lang.Object, org.gradle.api.Action) 方法。您还可以使用 MavenPublication.setArtifacts(java.lang.Iterable) 完全替换已发布的工件集合。这些方法共同为您提供了对要发布哪些工件的完全控制。

要自定义生成的 POM 中发布的元数据,请通过 MavenPublication.getPom() 方法返回的 POM 或直接通过传入 MavenPublication.pom(org.gradle.api.Action) 的动作(或闭包)设置属性,例如 MavenPom.getDescription()。作为最后的手段,可以使用 MavenPom.withXml(org.gradle.api.Action) 方法修改生成的 POM。

// Example of publishing a Java module with a source artifact and a customized POM
plugins {
    id 'java'
    id 'maven-publish'
}

task sourceJar(type: Jar) {
  from sourceSets.main.allJava
  archiveClassifier = "sources"
}

publishing {
  publications {
    myPublication(MavenPublication) {
      from components.java
      artifact sourceJar
      pom {
        name = "Demo"
        description = "A demonstration of Maven POM customization"
        url = "http://www.example.com/project"
        licenses {
          license {
            name = "The Apache License, Version 2.0"
            url = "https://apache.ac.cn/licenses/LICENSE-2.0.txt"
          }
        }
        developers {
          developer {
            id = "johnd"
            name = "John Doe"
            email = "john.doe@example.com"
          }
        }
        scm {
          connection = "scm:svn:http://subversion.example.com/svn/project/trunk/"
          developerConnection = "scm:svn:https://subversion.example.com/svn/project/trunk/"
          url = "http://subversion.example.com/svn/project/trunk/"
        }
      }
    }
  }
}

属性

属性描述
artifactId

此发布的 artifactId。

artifacts

此发布的完整工件集。

groupId

此发布的 groupId。

pom

将要发布的 POM。

version

此发布的版本。

方法

方法描述
artifact(source)

创建一个自定义 MavenArtifact 以包含在发布中。artifact 方法可以接受各种输入:

artifact(source, config)

创建一个 MavenArtifact 以包含在发布中,该工件由关联的动作配置。第一个参数用于创建一个自定义工件并将其添加到发布中,如 MavenPublication.artifact(java.lang.Object) 所示。然后,创建的 MavenArtifact 使用提供的动作进行配置,该动作可以覆盖工件的扩展名或分类器。此方法还接受配置动作作为闭包参数,通过类型强制转换。

from(component)

提供应发布的软件组件。

pom(configure)

配置将要发布的 POM。提供的动作将针对 MavenPublication.getPom() 结果执行。此方法也接受闭包参数,通过类型强制转换。

setArtifacts(sources)

清除先前从 MavenPublication.getArtifacts() 添加的所有工件,并根据指定的源创建工件。每个提供的源都按照 MavenPublication.artifact(java.lang.Object) 的方式解释。例如,要排除组件声明的依赖项,而是使用自定义工件集:

suppressAllPomMetadataWarnings()

取消所有 Maven 发布兼容性警告。当使用无法完全映射到 Maven POM 的 Gradle 功能时,会发出警告。

suppressPomMetadataWarningsFor(variantName)

取消指定变体的 Maven 发布兼容性警告。当使用无法完全映射到 Maven POM 的 Gradle 功能时,会发出警告。

versionMapping(configureAction)

配置版本映射策略。例如,对运行时依赖项使用已解析的版本:

脚本块

无脚本块

属性详情

String artifactId

此发布的 artifactId。

此发布的完整工件集。

String groupId

此发布的 groupId。

MavenPom pom (只读)

将要发布的 POM。

String version

此发布的版本。

方法详情

MavenArtifact artifact(Object source)

创建一个自定义 MavenArtifact 以包含在发布中。artifact 方法可以接受各种输入:

  • 一个 PublishArtifact 实例。扩展名和分类器值取自封装实例。
  • 一个 AbstractArchiveTask 实例。扩展名和分类器值取自封装实例。
  • 任何可以通过 Project.file(java.lang.Object) 方法解析为 File 的内容。扩展名和分类器值从文件名中推断。
  • 一个 Map,其中包含一个 'source' 条目,该条目可以解析为任何其他输入类型,包括文件。此映射可以包含 'classifier' 和 'extension' 条目,以进一步配置构造的工件。

以下示例演示了各种自定义工件的添加。

plugins {
    id 'maven-publish'
}

task sourceJar(type: Jar) {
  archiveClassifier = "sources"
}

publishing {
  publications {
    maven(MavenPublication) {
      artifact sourceJar // Publish the output of the sourceJar task
      artifact 'my-file-name.jar' // Publish a file created outside of the build
      artifact source: sourceJar, classifier: 'src', extension: 'zip'
    }
  }
}

MavenArtifact artifact(Object source, Action<? super MavenArtifact> config)

创建一个 MavenArtifact 以包含在发布中,该工件由关联的动作配置。第一个参数用于创建一个自定义工件并将其添加到发布中,如 MavenPublication.artifact(java.lang.Object) 所示。然后,创建的 MavenArtifact 使用提供的动作进行配置,该动作可以覆盖工件的扩展名或分类器。此方法还接受配置动作作为闭包参数,通过类型强制转换。

plugins {
    id 'maven-publish'
}

task sourceJar(type: Jar) {
  archiveClassifier = "sources"
}

publishing {
  publications {
    maven(MavenPublication) {
      artifact(sourceJar) {
        // These values will be used instead of the values from the task. The task values will not be updated.
        classifier = "src"
        extension = "zip"
      }
      artifact("my-docs-file.htm") {
        classifier = "documentation"
        extension = "html"
      }
    }
  }
}

void from(SoftwareComponent component)

提供应发布的软件组件。

  • 组件声明的任何工件都将包含在发布中。
  • 组件声明的依赖项将包含在发布的元数据中。

目前支持 3 种类型的组件:'components.java' (由 JavaPlugin 添加)、'components.web' (由 WarPlugin 添加) 和 `components.javaPlatform` (由 JavaPlatformPlugin 添加)。对于任何单个 MavenPublication,只能以这种方式提供一个组件。以下示例演示了如何将 'java' 组件发布到 Maven 存储库。

plugins {
    id 'java'
    id 'maven-publish'
}

publishing {
  publications {
    maven(MavenPublication) {
      from components.java
    }
  }
}

void pom(Action<? super MavenPom> configure)

配置将要发布的 POM。提供的动作将针对 MavenPublication.getPom() 结果执行。此方法也接受闭包参数,通过类型强制转换。

void setArtifacts(Iterable<?> sources)

清除先前从 MavenPublication.getArtifacts() 添加的所有工件,并根据指定的源创建工件。每个提供的源都按照 MavenPublication.artifact(java.lang.Object) 的方式解释。例如,要排除组件声明的依赖项,而是使用自定义工件集:

plugins {
    id 'java'
    id 'maven-publish'
}

task sourceJar(type: Jar) {
  archiveClassifier = "sources"
}

publishing {
  publications {
    maven(MavenPublication) {
      from components.java
      artifacts = ["my-custom-jar.jar", sourceJar]
    }
  }
}

void suppressAllPomMetadataWarnings()

取消所有 Maven 发布兼容性警告。当使用无法完全映射到 Maven POM 的 Gradle 功能时,会发出警告。

void suppressPomMetadataWarningsFor(String variantName)

取消指定变体的 Maven 发布兼容性警告。当使用无法完全映射到 Maven POM 的 Gradle 功能时,会发出警告。

void versionMapping(Action<? super VersionMappingStrategy> configureAction)

配置版本映射策略。例如,对运行时依赖项使用已解析的版本:

plugins {
    id 'java'
    id 'maven-publish'
}

publishing {
  publications {
    maven(MavenPublication) {
      from components.java
      versionMapping {
        usage('java-runtime'){
          fromResolutionResult()
        }
      }
    }
  }
}