我与依赖项存在冲突问题。
我的项目有两个依赖关系:
dependencies {
provided group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
compile files('path/to/ABC.jar')
}
ABC.jar
对javax.servlet:servlet-api
有依赖性:
dependencies {
provided group: 'javax.servlet', name: 'servlet-api', version: '2.5'
}
这是我正在处理的问题;我需要使用由 servlet-api 库提供的ServletContext
接口,编译器使用错误的接口。
Gradle自动解决版本冲突,如here所述。
但在我的情况下它并没有帮助,因为它仅在依赖有两个不同版本时才有效。在这种情况下;虽然它是较新的版本问题,但名称已从javax.servlet:servlet-api
更改为javax.servlet:javax.servlet-api
。因此,gradle不会自动解决此冲突,因为它似乎不是版本问题。
我尝试的是使用排除传递依赖,如here所述。
compile files('path/to/ABC.jar') {
exclude group: 'javax.servlet'
}
但它没有奏效,似乎exclude
无法在本地' jar'文件。
现在,我不知道还能做些什么。
如何排除作为本地文件添加的依赖项的依赖项?
(如果第一个问题还没有答案)我怎么能说编译器使用正确的ServletContext
接口?
答案 0 :(得分:3)
compile files('path/to/ABC.jar')
是文件依赖项,文件依赖项没有任何依赖项信息,因此它不会引入传递依赖项。如果这个ABC.jar
是一个包含在JAR中的依赖类的“胖”jar,它不适合用于处理依赖项的Gradle,Maven或Ant / Ivy之类的东西。您必须使用正确声明的依赖项的正确“瘦”版本的依赖项,或者您需要在构建脚本中“重新打包”该JAR以排除您不想引入的依赖项类。无依赖项管理可以为你做这件事。
您可以执行gradlew dependencyInsight --configuration runtime --dependency javax.servlet:servlet-api
或gradlew dependencies --configuration runtime
以找出依赖项的真正来源。
实际上,如果我正确看到你的例子甚至不应该编译,因为它应该很可能是
compile files('path/to/ABC.jar'), {
exclude group: 'javax.servlet'
}
或
compile(files('path/to/ABC.jar')) {
exclude group: 'javax.servlet'
}
但正如我所说,由于本地文件依赖性没有传递依赖性,所以无论如何排除都没有意义。
要使Gradle版本冲突魔法工作,您可以通过使用模块替换(例如
)告诉Gradle这些库实际上是具有不同坐标的相同库dependencies {
modules {
module('javax.servlet:servlet-api') {
replacedBy 'javax.servlet:javax.servlet-api'
}
}
}
然后Gradle将它们视为同一个库,并且可以执行其版本冲突解决魔法。需要旧版本的库是否仍适用于新版本是一个不同的主题,您必须检查和/或自己尝试。这总是取决于新版本是否向后兼容旧版本。
答案 1 :(得分:1)
我现在无法测试,但我相信你的语法错了。我在这里有一些看起来不同的例子,在你的情况下它会是:
compile(files('path/to/ABC.jar')) {
exclude group: 'javax.servlet'
}
正如我所说,我现在无法测试,检查它是否有帮助并发表评论。