gpt4 book ai didi

java - 在 Gradle 中,如何生成一个 POM 文件,其中动态依赖项解析为实际使用的版本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:37 33 4
gpt4 key购买 nike

在 Gradle 中,如何生成一个 POM 文件,其中动态依赖项解析为实际使用的版本?

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

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

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.+</version>
<scope>test</scope>
</dependency>
</dependencies>

我想将 + 解析为如下所示的应计版本。

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

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

With this hook, you can modify any aspect of the POM. For example, you could replace the version range for a dependency with the actual version used to produce the build.

解决方案

使用 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<ResolvedArtifact> 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 发行版包含 tiny sample演示 POM 操作。有关 XmlParser 的信息可以在 Groovy 文档中找到。

关于java - 在 Gradle 中,如何生成一个 POM 文件,其中动态依赖项解析为实际使用的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959558/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com