【问题标题】:Which Version of maven supports exclusion from dependency Management哪个版本的maven支持从依赖管理中排除
【发布时间】:2019-04-12 16:55:11
【问题描述】:

我有一个从一个外部项目依赖项继承的依赖项,我们无法控制它,我们想从该项目中排除一个特定的依赖项。尝试了几次排除尝试,但仍然无法排除相同的。

<dependency>
<groupId>..</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
    <exclusion>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
    </exclusion>
</exclusions>
</dependency>

谁能让我知道是否可以排除依赖。我使用的是 3.5.2 maven 版本。

【问题讨论】:

  • 使用 Maven 3.5.4 排除工作正常。通常,我将它们设置在您提到的依赖管理部分。
  • 你的依赖看起来很奇怪,因为你有类型 pom 和 scope 导入。为什么?
  • @KérdezösködőIndián 尝试了最新版本 3.6.0 但没有解决我的问题。
  • 排除适用于所有较新的 Maven 版本......你的 pom.xml 中一定有一些错误。您能否添加更多详细信息,特别是回答我关于为什么要排除导入范围依赖项的问题?
  • @JFMeier 我想从中排除依赖项的这个项目由其他团队管理,我们不能要求他们更新作为现有导入一部分的特定 jar 的依赖项,即几年前做的。所以我想排除该依赖项并添加我的依赖项版本。但问题在于它是通过&lt;scope&gt;import&lt;/scope&gt; 管理的,即使我们添加排除项,并使用正确的版本添加我们的依赖项,它也会覆盖版本。希望我回答你的问题。这是一个传递依赖的例子参考这个issues.apache.org/jira/browse/MNG-5600

标签: maven maven-3 dependency-management


【解决方案1】:

好像那个版本还没有发布,但是有一个解决方法。

Importing Dependencies 有一个依赖项导入示例,说明如下:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven</groupId>
    <artifactId>Z</artifactId>
    <packaging>pom</packaging>
    <name>Z</name>
    <version>1.0</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>X</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>Y</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

在上面的示例中,Z 从 X 和 Y 导入托管依赖项。但是,X 和 Y 都包含依赖项 a。这里将使用 1.1 版本的 a,因为 X 是先声明的,而 a 没有在 Z 的依赖管理中声明。

鉴于该描述,如果您在 BEFORE 导入之前对其进行定义,您应该能够覆盖违规依赖项的版本和/或范围。

同样的例子,下面的定义应该使用a的2.0版本:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven</groupId>
    <artifactId>Z</artifactId>
    <packaging>pom</packaging>
    <name>Z</name>
    <version>1.0</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>test</groupId>
                <artifactId>a</artifactId>
                <version>2.0</version>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>X</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>maven</groupId>
                <artifactId>Y</artifactId>
                <version>1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

一定要检查有效的pom!

【讨论】:

    【解决方案2】:

    在 Maven 中,排除功能已经存在很长时间了,这不是问题所在。保留当前的 ​​Maven 版本,它会很好地完成工作。

    我认为那里存在混乱。 从您在上面编写的 pom 摘录中,我们可以看到您导入了一个 pom(范围“导入”),通常称为 BOM(用于物料清单)。

    一个 BOM 被导入 &lt;dependencyManagement&gt; 部分(上面没有显示),它的目标可以总结为:“我定义了许多不同的库,包括它们的版本,所以如果你导入我,你可以省略指定版本您定义的库,但您仍然必须明确定义您的直接依赖项”。

    我的意思是,BOM 不会“强迫”你使用它定义的库:它只是暗示如果你或你的依赖项依赖于特定的库 Z,那么 Z 的版本将是强制为 BOM 中定义的那个”。

    因此 BOM 不会“强制”依赖于您,因此您不能“排除”定义 BOM 的任何依赖项。 您必须在 自己的 项目中准确找到要排除的依赖项 Z 的定义位置,然后将其删除。它也可能作为传递依赖项带来,在这种情况下,您必须使用将其排除在您使用 &lt;exclusions&gt; / &lt;exclusion&gt; 标记和 groupId / artifactId 指定的依赖项之外。

    总结:改变你的方法,你没有找对地方。并且还使用 Maven 依赖插件,它是你最好的朋友来了解你不需要的依赖的确切来源(mvn dependency:tree)。

    希望对你有帮助

    PS:你没有说,但你有一个多模块项目吗?

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2015-10-17
      • 2013-09-03
      • 2015-10-13
      • 2016-10-16
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多