2个不同的依赖问题中的相同接口

时间:2017-10-09 14:31:26

标签: java gradle dependency-management

我与依赖项存在冲突问题。

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

dependencies {

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

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

}

ABC.jarjavax.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接口?

2 个答案:

答案 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-apigradlew 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'
}

正如我所说,我现在无法测试,检查它是否有帮助并发表评论。