2017-10-09 99 views
1

我与依赖关系存在冲突问题。2个不同依赖项问题中的相同界面

我的项目有两个依赖关系是这样的:

dependencies { 

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

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

} 

ABC.jar有它自己的依赖关系​​:

dependencies { 

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

} 

这里是我处理这个问题;我需要使用ServletContext接口,它由servlet-api库提供,编译器使用错误的接口。

Gradle按照here所述自动解决版本冲突。

但在我的情况下,它并没有帮助,因为它只适用于依赖项有两个不同的版本。在这种情况下;虽然这是一个较新的版本问题,但名称已从​​更改为javax.servlet:javax.servlet-api。所以Gradle不会自动解决这个冲突,因为它似乎不是一个版本问题。

我试过的东西是用here所描述的排除传递依赖。

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

但它没有工作,似乎exclude不适用于本地'jar'文件。

现在,我不知道还有什么要做。

如何排除作为本地文件添加的依赖项的依赖关系?

(如果第一个问题还没有任何答案)我怎么能说编译器使用正确的ServletContext接口?

回答

3

compile files('path/to/ABC.jar')是一个文件依赖项,文件依赖项没有任何依赖项信息,所以它不会引入传递依赖项。如果这个ABC.jar是一个“胖”的JAR中包含依赖类的jar,它不适合用于像Gradle,Maven或Ant/Ivy这样的用于处理依赖关系的东西。您必须使用正确声明的依赖关系来使用适当的“精简”版本的依赖关系,或者您需要在生成脚本中“重新打包”该JAR以排除不想引入的依赖关系类。无依赖关系管理可以为你做这个。

您可以执行gradlew dependencyInsight --configuration runtime --dependency javax.servlet:servlet-apigradlew dependencies --configuration runtime来找出依赖关系的确切来源。


其实你的例子甚至不应该编译如果我正确地看到它,因为它应该最有可能是

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

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

但正如我所说,用一个本地文件依赖关系没有传递依赖关系,因此排除无论如何都没有意义。


为了使摇篮版本冲突魔力的工作,你可以简单地告诉摇篮,这些库实际上只是使用不同的坐标相同的库通过更换模块像

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

然后摇篮看到他们作为同一个库,可以做它的版本冲突解决魔法。是否需要旧版本的库仍然适用于新版本,这是一个不同的话题,您必须检查和/或尝试一下。这种情况总是取决于新版本是否向后兼容旧版本。

1

我现在没有办法测试这个,但我相信你的语法是错误的。我这里有一些例子,看起来不同,在你的情况将是:

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

正如我说的,我现在不能测试,检查是否有帮助,并给予评论。