java - quinta - Gradle: Anular la dependencia transitiva por el clasificador de versión
quinta forma normal pdf (4)
Una de las dependencias declaradas en mi proyecto tiene una dependencia transitiva en ''com.google.guava:guava:15.0''
. Pero mi aplicación implementada en WAS / Weblogic no funciona debido a un problema de CDI que se ha corregido en ''com.google.guava:guava:15.0:cdi1.0''
. (la misma versión, pero con clasificador) Necesito decirle a gradle que use este jar durante la compilación y el empaquetado. Estoy tratando de averiguar cómo podemos reemplazar esta dependencia transitiva con un clasificador de versión específico de jar.
Probé los siguientes approches:
- Agregó explícitamente la dependencia:
compile ''com.google.guava:guava:15.0:cdi1.0''
. Pero ambos frascos se incluyeron en la GUERRA resultante. Agregó la dependencia explícitamente y definió una estrategia de resolución:
configurations.all { resolutionStrategy { force ''com.google.guava:guava:15.0:cdi1.0'' } }
Incluso esto no funcionó.
Definí una estrategia de resolución para comprobar y cambiar la versión.
configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group + ":" + details.requested.name == ''com.google.guava:guava'') { details.useVersion "15.0:cdi1.0" //details.useTarget "com.google.guava:guava:15.0:cdi1.0" } } }
Incluso esto no funcionó.
Necesita sus sugerencias sobre cómo se puede abordar este problema.
Esto no funcionará si la misma dependencia es señalada por algún otro tarro. Manera segura de excluir la dependencia.
configurations {
all*.exclude group: ''com.google.guava'', module:''guava-jdk5''
}
Gradle 4.5.1 tiene la función DependencySubstitutions . Aquí un ejemplo para reemplazar una dependencia:
configurations.each {
c -> c.resolutionStrategy.dependencySubstitution {
all { DependencySubstitution dependency ->
if (dependency.requested.group == ''org.json'') {
dependency.useTarget ''com.vaadin.external.google:android-json:0.0.20131108.vaadin1''
}
}
}
}
Los clasificadores actuales todavía no se tienen en cuenta cuando se trata de resolutionStrategies. Una solución para usted podría excluir la biblioteca de guava transitiva al declarar sus dependencias y agregar explícitamente la versión de guava cdi1.0:
dependencies {
compile ("org.acme:someDependency:1.0"){
exclude group: ''com.google.guava'', module: ''guava''
}
compile "com.google.guava:guava:15.0:cdi1.0"
}
Me encontré con un enfoque más elegante que es simplemente:
compile ("com.google.guava:guava:15.0:cdi1.0") {
force = true
}
Explicación
Establecer force = true
para una dependencia le dice a gradle que use la versión especificada en caso de un conflicto de versión