在Maven2中,为了排除单个传递依赖,我必须这样做:

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

这种方法的问题在于,我必须对sample-artifactB提供的每个传递依赖项都这样做。

是否有一种方法可以使用某种通配符一次性排除所有传递依赖项,而不是逐个排除?


当前回答

对我有用的(可能是Maven的一个新特性)只是在排除元素中使用通配符。

我有一个多模块项目,其中包含一个在两个war打包模块中引用的“app”模块。其中一个war打包的模块实际上只需要域类(我还没有将它们从app模块中分离出来)。我发现这个方法很有效:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

groupId和artifactId上的通配符排除了通常会通过使用该依赖项传播到模块的所有依赖项。

其他回答

我发现有一件事很有用:

如果您将带有排除项的依赖项放在项目的父POM的dependencyManagement部分中,或者放在可导入的依赖项管理POM中,那么您就不需要重复排除项(或版本)。

例如,如果你的父POM有:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

然后,项目中的模块可以简单地将依赖声明为:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

父POM中的将指定版本和排除项。我几乎在我们所有的项目中都使用了这个技巧,它消除了很多重复。

我使用以下的解决方法:而不是试图在所有适当的依赖项中排除工件,我在顶层将依赖项绘制为“提供”。 例如,为了避免发布xml-api的“任何版本”:

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>

如果你需要排除你要包含在程序集中的依赖工件中的所有传递依赖项,你可以在程序集插件的描述符中指定:

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

如果你在Eclipse下开发,你可以在POM编辑器(启用高级选项卡)依赖关系图中寻找你想要排除的项目依赖关系,然后:

右键单击它->“Exclude Maven Artifact…”Eclipse将为您排除,而不需要查找库链接到哪个依赖项。

在类路径中使用最新的maven ..它将删除重复的工件并保留最新的maven工件。