在Gradle中,如何生成具有动态依赖关系的POM文件,该文件已解析为所使用的实际版本?

在Gradle中,如何生成具有动态依赖关系的POM文件,该文件已解析为所使用的实际版本?

dependencies { testCompile(group: 'junit', name: 'junit', version: '4.+') } 

这是从上面的依赖项生成的。

   junit junit 4.+ test   

我希望将+解析为如下的应计版本。

   junit junit 4.12 test   

关于Maven Publishing的Gradle指南章节讨论了这样做,但没有提到如何做。

使用此挂钩,您可以修改POM的任何方面。 例如,您可以使用用于生成构建的实际版本替换依赖项的版本范围。

使用Peter Niederwieser的答案中的信息,我创建了一个任务,该任务读取包含动态依赖关系的POM,并使用已解析依赖关系的新pom覆盖它。

 /** * Reads and Overwrites POM file resolving dynamic dependencies */ task cleanPom(dependsOn: writeNewPom) << { // Get existing pom file Node xml = new XmlParser().parse(pomFileLocation) // Generate map of resolved versions Map resolvedVersionMap = new HashMap() Set resolvedArtifacts = configurations.compile.getResolvedConfiguration().getResolvedArtifacts() resolvedArtifacts.addAll(configurations.testCompile.getResolvedConfiguration().getResolvedArtifacts()) resolvedArtifacts.each { resolvedVersionMap.put(it.getName(), it.getModuleVersion().getId().getVersion()) } // Update dependencies with resolved versions xml.dependencies.first().each { Node artifactId = it.get("artifactId").first() def artifactName = artifactId.value().first() def artifactVersion = resolvedVersionMap.get(artifactName) Node version = it.get("version").first() version.value = artifactVersion } // Overwrite existing pom file new XmlNodePrinter(new PrintWriter(new FileWriter(pomFileLocation))).print(xml) } 

需要一些努力才能编写代码。 两个主要部分是:

  • 使用Configuration#getIncomingConfiguration#getResolvedConfiguration API查询已解析的版本
  • 使用Groovy的XMlParser API操作POM(假设使用了新的maven-publish插件)

有关Configuration API的信息可以在Gradle Build Language Reference中找到 ,它可以进一步链接到Javadoc。 完整的Gradle分布包含一个演示POM操作的小样本 。 有关XmlParser信息可以在Groovy文档中找到。

我已经尝试将它集成到一个可以应用的插件中,具体代码可以在这里找到: https : //github.com/nebula-plugins/nebula-publishing-plugin/blob/master/src/main/常规/星云/插件/出版/行家/ ResolvedMavenPlugin.groovy

它可以通过jcenter()通过’com.netflix.nebula:nebula-publishing-plugin:1.9.1’包含在内。

Peter建议的pom.withXml()解决方案如下所示:

 publishing { publications { mavenCustom(MavenPublication) { from components.java pom.withXml { // Generate map of resolved versions Map resolvedVersionMap = [:] Set resolvedArtifacts = configurations.compile.getResolvedConfiguration().getResolvedArtifacts() resolvedArtifacts.addAll(configurations.testCompile.getResolvedConfiguration().getResolvedArtifacts()) resolvedArtifacts.each { ModuleVersionIdentifier mvi = it.getModuleVersion().getId(); resolvedVersionMap.put("${mvi.getGroup()}:${mvi.getName()}", mvi.getVersion()) } // Update dependencies with resolved versions def hasDependencies = !asNode().dependencies.isEmpty() if (hasDependencies) { asNode().dependencies.first().each { def groupId = it.get("groupId").first().value().first() def artifactId = it.get("artifactId").first().value().first() it.get("version").first().value = resolvedVersionMap.get("${groupId}:${artifactId}") } } } } }