Gradle: cómo declarar una dependencia a una configuración específica de un proyecto programáticamente en Java.
Siguiendo la configuración descrita en Compartir artefactos entre proyectos de forma sencilla, nos encontramos en el caso especial donde tenemos una construcción de Gradle de múltiples módulos que produce diferentes tipos de archivos JAR y nos gustaría declarar una dependencia hacia esos archivos JAR en una configuración.
dependencies {
instrumentedClasspath(project(path: ":producer", configuration: 'instrumentedJars'))
}
Desde la documentación funciona muy bien.
En el proyecto dependency-tests tengo un proyecto que reproduce la configuración (con nombres diferentes, pero la idea es la misma).
Pero estoy haciendo esto en un plugin de Gradle y me gustaría tener la misma declaración en Java.
DependencyHandler dependencyHandler = project.getDependencies();
// this adds a dependency to the main jar of the 'producer' project:
dependencyHandler.add("instrumentedClasspath", project.getRootProject().findProject(":producer"));
// this is not working:
dependencyHandler.add("instrumentedClasspath", project.getRootProject().findProject(":producer").getConfigurations().getByName("instrumentedJars"));
<p>Fallando con el siguiente mensaje de error:
“`
FAILURE: Build failed with an exception.</p>
<ul>
<li>What went wrong:
Execution failed for task ':printConf'.
> Could not resolve all dependencies for configuration ':instrumentedJars'.
> Cannot convert the provided notation to an object of type Dependency: configuration ':producer:instrumentedJars' artifacts.
The following types/formats are supported:
<ul>
<li>Instances of Dependency.</li>
<li>String or CharSequence values, for example 'org.gradle:gradle-core:1.0'.</li>
<li>Maps, for example [group: 'org.gradle', name: 'gradle-core', version: '1.0'].</li>
<li>FileCollections, for example files('some.jar', 'someOther.jar').</li>
<li>Projects, for example project(':some:project:path').</li>
<li>ClassPathNotation, for example gradleApi().
Comprehensive documentation on dependency notations is available in DSL reference for DependencyHandler type.</p></li>
</ul></li>
<li>Try:
> Run with –info or –debug option to get more log output.
> Run with –scan to get full insights.</p></li>
</ul>
<p>“`
davy.ai
Solución
El problema en el código Java es que la configuración
instrumentedJars
se está pasando como una cadena de texto (String
) en lugar de un objetoConfiguration
. Para solucionar esto, podemos obtener el objetoConfiguration
del proyecto utilizando su nombre:Esto agregará la configuración
instrumentedJars
del proyectoproducer
como una dependencia en la configuracióninstrumentedClasspath
del proyecto actual.