【发布时间】:2012-09-19 10:42:37
【问题描述】:
在我的项目中有一个实现接口的类。该接口来自依赖项。我有另一个依赖项,它本身依赖于一个也包含相同接口的 jar,除了具有更多方法的版本;包含相同包接口的两个 jar 没有相同的 groupId 或 artifactId。
编译失败,因为编译器抱怨我项目中的类没有实现所有方法。我意识到这是因为编译器从错误的 jar 中获取接口引用。我的问题是,为什么 maven 使用传递依赖项中的接口,而不是我在项目 POM 中明确提到的 jar 中的接口?我可以看到使用的 jar 出现在定义的前面(所以我也想在类路径中),但我认为在这些情况下,maven 通过使用具有最短路径
这里是依赖树的一部分。 请注意,这是 grepped,但仍然可以看出 javax.servlet:servlet-api(实际使用的那个)比 tomcat:servlet(应该使用的那个)在树中更深
[builder@ca-rd-build11 proj]$ mvn dependency:tree | grep servlet
[INFO] | +- javax.servlet:servlet-api:jar:2.4:compile
[INFO] +- tomcat:servlet:jar:4.0.6:compile
我使用的是 maven 3.0.4
【问题讨论】:
-
tomcat:servlet:jar 应该被提供,而不是编译。您应该针对 javax.servlet:servlet-api 进行编译,并添加对适当版本的依赖。