web-dev-qa-db-fra.com

Gradle: remplacer la dépendance transitive par le classificateur de version

L'une des dépendances déclarées dans mon projet a une dépendance transitive sur 'com.google.guava:guava:15.0'. Mais mon application déployée sur WAS/Weblogic ne fonctionne pas en raison d'un problème CDI qui a été corrigé dans 'com.google.guava:guava:15.0:cdi1.0'. (même version, mais avec classificateur) J'ai besoin de dire à gradle d'utiliser ce pot pendant la construction et l'empaquetage. J'essaie de comprendre comment nous pouvons contourner cette dépendance transitive avec un classificateur de version spécifique au pot.

J'ai essayé les approches suivantes:

  1. Ajout de la dépendance explicitement: compile 'com.google.guava:guava:15.0:cdi1.0'. Mais les deux pots ont été inclus dans la GUERRE résultante.
  2. Ajout de la dépendance explicitement et définition d'une stratégie de résolution:

    configurations.all {
        resolutionStrategy {
            force 'com.google.guava:guava:15.0:cdi1.0'
        }
    }
    

    Même cela n'a pas fonctionné.

  3. Définition d'une stratégie de résolution pour vérifier et changer la version.

    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"
            }
        }
    }
    

    Même cela n'a pas fonctionné.

Besoin de vos suggestions sur la façon de résoudre ce problème.

42
dinup24

actuellement, les classificateurs ne sont pas encore pris en compte en ce qui concerne les stratégies de résolution. Une solution de contournement pour vous pourrait exclure la bibliothèque de goyaves transitive lors de la déclaration de vos dépendances et de l'ajout explicite de la version cava1.0 de goyave:

dependencies {
    compile ("org.acme:someDependency:1.0"){
        exclude group: 'com.google.guava', module: 'guava'
    }       
    compile "com.google.guava:guava:15.0:cdi1.0"
}
51
Rene Groeschke

Je suis tombé sur une approche plus élégante qui est tout simplement:

compile ("com.google.guava:guava:15.0:cdi1.0") {
  force = true
}

Explication

Réglage force = true pour une dépendance indique à gradle d'utiliser la version spécifiée en cas de conflit de version

22
Sobvan

Gradle 4.5.1 a la fonction DependencySubstitutions . Voici un exemple pour remplacer une dépendance:

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'
            }
        }
    }
}
5
koppor

Cela ne fonctionnera pas si la même dépendance est pointée par un autre pot. Manière sûre d'exclure la dépendance

configurations {
 all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
2
Abhijit Mazumder