当前位置: 首页 > 面试题库 >

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

房光临
2023-03-14
问题内容

在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指南一章讨论了如何执行此操作,但未提及操作方法

使用此钩子,可以修改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<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#getResolvedConfigurationAPI 查询已解析的版本
  • 使用Groovy的XMlParserAPI 操纵POM (假设使用了新maven-publish插件)

关于ConfigurationAPI的信息可以在Gradle Build Language
Reference中
找到,该参考文献进一步链接到Javadoc。完整的Gradle发行版包含一个演示POM操作的小样本。有关信息,XmlParser可以在Groovy文档中找到。



 类似资料:
  • 我正在使用“maven”插件将Gradle构建创建的工件上传到Maven中央存储库。我正在使用类似于以下任务的任务: 然而,此任务创建的POM文件不能正确报告在我的Gradle构建文件中被排除的依赖项。例如: 如何在生成的POM文件中正确管理排除的依赖项?

  • 我正在尝试生成。jar,但是当它是使用Maven publishing生成的时候,它也生成了一个. pom文件。 问题是,我有另一个项目,当它实现这个依赖关系时,它以前只查找.jar,而现在它在所有其他项目中查找.pom,我想做的是,该项目停止使用“发布”任务生成.pom或在实现时停止寻找.pom文件以供其他项目使用。 下面是在 Artifactory 项目 A 中生成.jar的代码,其中项目 B

  • 我有一个简单的maven插件,它依赖于父pom文件。父pom文件有十个(10个)第三方jar依赖项,这些依赖项已经使用以下命令安装在我的本地回购中。 类似地,我已经安装了所有其他9个罐子到我的本地回购。这是uber pom.xml文件。 我也尝试使用uber-pom作为一个插件依赖,因为我是绝望的。有什么想法吗?

  • 假设<code>B:1.0.1,但是子项目应该依赖于<code>A:1.2(有意覆盖传递依赖性)。 很容易发现 ,并从它的所有子POM中删除样板文件。不幸的是,下面的设置导致在最终的工件中使用两个版本:< code>A:1.0.1(作为< code>B:1.0.1的依赖项)和< code>A:1.0.2(来自父pom中的显式声明)。 如何在所有子项目中强制使用< code>A:1.0.2版本,并在

  • 我试图使用gradle和以下指令指定一些jar依赖项: http://gradle.org/docs/current/userguide/dependency_management.html#sub:file_dependencies 当我从windows cmd运行gradle时,我得到: 我错过了什么?

  • 使用日食(赫利俄斯)的常春藤2.2和常春藤DE 2.2。... 想从http://maven . spring framework . org/milestone/org/spring framework/data/spring-data-neo4j/2 . 1 . 0 . m1获取spring-data-neo4j及其默认依赖项 在我的常春藤文件中使用以下内容: 以及我的设置文件中的这些解析器: