哪个版本的maven支持从依赖项管理中排除

时间:2018-11-09 05:27:47

标签: maven maven-3 dependency-management

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

<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版本。

2 个答案:

答案 0 :(得分: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。在这里,将使用a的1.1版,因为先声明了X,而在Z的dependencyManagement中未声明a。

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

按照相同的示例,以下定义应使用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!

答案 1 :(得分:1)

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

我认为那里很混乱。 从上面编写的pom摘录中,我们可以看到您导入了一个pom(范围为“ import”),通常称为BOM(对于BOM表)。

物料清单在<dependencyManagement>部分中导入(上面未显示),其目标可以归纳为:“我定义了许多不同的库,包括它们的版本,因此如果您导入我,则可以省略指定您定义的库的版本,但仍然必须明确定义直接依赖项。”

通过这种方式,我的意思是BOM不会“强迫”您使用其定义的库:它仅表示在您或您的依赖项依赖于特定库Z的情况下,Z的版本将为强制使用BOM表中定义的那个。”

因此BOM不会“强加”您的依赖关系,因此您不能“排除”定义BOM的任何依赖项。 您必须准确找到要排除的依赖项Z在 own 项目中的定义位置,然后将其删除。它也可以作为传递性依赖项提供,在这种情况下,您必须使用<exclusions> / <exclusion>标签和groupId / {{1}指定的依赖项中排除它}。

总结:改变您的方法,您的眼光不正确。并使用Maven依赖插件,它是您最好的朋友,以了解您不想要的依赖的确切来源(artifactId

我希望对您有帮助

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