2017-10-09 4 views
1

J'ai un problème de conflit avec les dépendances.Même interface dans 2 problèmes de dépendance différents

Mon projet a deux dépendances comme celui-ci:

dependencies { 

    provided group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' 

    compile files('path/to/ABC.jar') 

} 

ABC.jar a sa propre dépendance à javax.servlet:servlet-api:

dependencies { 

    provided group: 'javax.servlet', name: 'servlet-api', version: '2.5' 

} 

Voici le problème que je traite; J'ai besoin d'utiliser l'interface ServletContext qui est fournie par les deux bibliothèques servlet-api et le compilateur utilise un mauvais. Le correcteur résout automatiquement les conflits de version comme décrit here.

Mais dans mon cas cela n'aide pas, car cela ne fonctionne que lorsqu'une dépendance a deux versions différentes. Dans ce cas; Bien qu'il s'agisse d'un problème de version plus récent, le nom est passé de javax.servlet:servlet-api à javax.servlet:javax.servlet-api. Donc Gradle ne résout pas automatiquement ce conflit, car il ne semble pas y avoir de problème de version.

La chose que j'ai essayé utilisait l'exclusion de la dépendance transitive comme décrit here.

compile files('path/to/ABC.jar') { 
    exclude group: 'javax.servlet' 
} 

Mais il ne fonctionne pas, il semble exclude ne fonctionne pas sur les fichiers « jar » locaux.

Maintenant, je ne sais pas quoi faire d'autre.

Comment puis-je exclure une dépendance d'une dépendance ajoutée en tant que fichier local?

(Si la première question n'a encore aucune réponse) Comment puis-je dire au compilateur d'utiliser l'interface ServletContext correcte?

Répondre

3

compile files('path/to/ABC.jar') est une dépendance de fichier, une dépendance de fichier n'a aucune information de dépendance, donc il n'introduit pas de dépendances transitives. Si ce ABC.jar est un fichier "gras" contenant les classes de dépendances incluses dans le fichier JAR, il n'est pas adapté à l'utilisation de Gradle, Maven ou Ant/Ivy censé gérer les dépendances. Vous devez utiliser une version "fine" de la dépendance avec les dépendances correctement déclarées, ou vous devez "reconditionner" ce JAR dans votre script de construction pour exclure les classes de dépendances que vous ne voulez pas extraire. Aucune gestion des dépendances peut le faire pour vous. Vous pouvez exécuter gradlew dependencyInsight --configuration runtime --dependency javax.servlet:servlet-api ou gradlew dependencies --configuration runtime pour savoir d'où provient réellement la dépendance.


En fait, votre exemple ne devrait même pas compiler si je le vois bien, car il devrait très probablement être

compile files('path/to/ABC.jar'), { 
    exclude group: 'javax.servlet' 
} 

ou

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

Mais comme je l'ai dit, avec un fichier local dépendance il n'y a pas de dépendances transitives, donc une exclusion n'a pas de sens du tout de toute façon.


Pour rendre le travail magique des conflits version Gradle, vous pouvez simplement dire Gradle que ces bibliothèques sont en fait la même bibliothèque juste avec des coordonnées différentes en utilisant un remplacement du module comme

dependencies { 
    modules { 
     module('javax.servlet:servlet-api') { 
      replacedBy 'javax.servlet:javax.servlet-api' 
     } 
    } 
} 

Alors Gradle les voit comme la même bibliothèque et peut faire sa version magie de résolution de conflit. Si la bibliothèque qui a besoin de l'ancienne version fonctionne toujours avec la nouvelle version est un sujet différent que vous devez vérifier et/ou essayer vous-même. Cela dépend toujours si la nouvelle version est rétrocompatible avec l'ancienne version.

1

Je n'ai aucun moyen de tester cela maintenant, mais je crois que votre syntaxe est fausse. J'ai quelques exemples ici qui semblent différentes, dans votre cas, il serait:

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

Comme je le dis, je ne peux pas tester maintenant, vérifier si elle aide et faire un commentaire.