【问题标题】:Maven dependency orderMaven依赖顺序
【发布时间】: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 进行编译,并添加对适当版本的依赖。

标签: java maven jar


【解决方案1】:

当你声明你对另一个 jar 文件的依赖时,你可以告诉它排除对冲突 jar 文件的传递依赖:

    <dependency>
        <groupId>group</groupId>
        <artifactId>artifact</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>othergroup</groupId>
                <artifactId>ArtifactToExclude</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

【讨论】:

  • 是的,我想过这样做。但我的问题,不仅仅是如何修复它,是为什么 maven 从错误的 jar 中获取接口?我想了解逻辑
  • 在这种情况下,我认为 Sean Patrick Floyd 是正确的,它们将按照它们在 pom 文件中声明的顺序出现在类路径中。
【解决方案2】:

为什么 maven 使用传递依赖的接口 而不是我在 项目 POM?

因为,对 Maven 来说,这两者没有任何关系。 Maven 不知道类或包名,Maven 只知道 groupId 和 artifactId。由于它们不一样,maven 没有任何理由省略传递依赖。

如果我是正确的,Maven 会将依赖项按定义的顺序放置在类路径中,即依赖项a 的传递依赖项出现在依赖项b 之前。

【讨论】:

    【解决方案3】:

    对于未来的访问者(因为标题是通用的):

    在 Maven 中,您有两类依赖项:

    根据官方 Maven documentation,当遇到多个版本作为依赖项时,将应用以下中介:

    Maven 选择“最近的定义”。也就是说,它使用依赖关系树中与您的项目最接近的依赖关系的版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则第一个声明获胜。

    示例:如果 A、B 和 C 的依赖项定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则 D 1.0 将是在构建 A 时使用,因为从 A 到 D 通过 E 的路径更短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0。

    在上面的例子中,A是实际的项目,B和E是在其pom.xml文件中定义的外部依赖,C和D是传递依赖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多