En Gradle, ¿cómo puedo generar un archivo POM con las dependencias dinámicas resueltas a la versión real utilizada?

En Gradle, ¿cómo puedo generar un archivo POM con las dependencias dinámicas resueltas a la versión real utilizada?

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

Esto se genera a partir de la dependencia anterior.

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

Quiero tener el+ resuelto a una versión de acumulación como abajo.

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

El capítulo guía de Gradle enMaven Publishing Habla de hacer esto, pero no menciona cómo.

Con este gancho, puedes modificar cualquier aspecto del POM. Por ejemplo, podría reemplazar el rango de versión de una dependencia con la versión real utilizada para producir la compilación.

Solución

Usando la información en la respuesta de Peter Niederwieser, creé una tarea que lee un POM que contiene dependencias dinámicas y lo sobrescribe con un nuevo pom que tiene las dependencias resueltas.

/**
 * 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)
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta