Maven 2 排除单个依赖项的所有可传递依赖项

Maven 2 排除单个依赖项的所有可传递依赖项,maven-2,dependencies,Maven 2,Dependencies,在Maven2中,要排除单个可传递依赖项,我必须执行以下操作: <dependency> <groupId>sample.group</groupId> <artifactId>sample-artifactB</artifactId> <version>1</version> <exclusions> <exclusion> <groupI

在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>

样本组
样本伪影
1.
样本组
样品人工制品
这种方法的问题是,我必须对
sample artifactB
提供的每个可传递依赖项都这样做


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

排除所有可传递依赖项的原因是什么

如果您需要从每个依赖项中排除某个特定的工件(例如commons日志记录),该方法可能会有所帮助



2012年更新:不要使用这种方法。使用。版本99会产生虚假的依赖项,并且版本99存储库处于脱机状态(虽然有,但您也不能依靠它们永远保持联机状态;最好只使用Maven Central)。

对于maven2,没有办法做到您所描述的。对于maven 3来说,有一个问题。如果您使用的是maven 3,请参见


对于maven 2,我建议您为具有您的特性的依赖项创建自己的自定义pom。对于需要使用该依赖项的项目,将该依赖项设置为自定义pom,而不是典型工件。虽然这不一定允许您用一个单独的代码排除所有可传递依赖项,但它确实允许您只需编写一次依赖项,并且您的所有项目不需要维护不必要的长排除列表。

目前,无法一次排除多个可传递依赖项,但在Maven JIRA网站上有一个功能要求:


有一种解决方法,如果将依赖项的范围设置为运行时,则可传递依赖项将被排除。不过,请注意,如果要打包运行时依赖项,这意味着您需要添加额外的处理


要在任何打包中包含运行时依赖项,可以使用maven依赖项插件。

我发现有一件事很有用:

如果将带有排除项的依赖项放在项目的父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>

...         
文件上传
文件上传
1.2.1
朱尼特
朱尼特
....
然后,项目中的模块可以简单地将依赖项声明为:

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

文件上传
文件上传
父POM中的将指定版本和排除项。我几乎在我们所有的项目中都使用了这种技术,它消除了大量的重复。

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

我有一个多模块项目,其中包含一个“应用”模块,该模块在两个WAR打包模块中引用。其中一个战争包装的模块实际上只需要域类(我还没有将它们从应用程序模块中分离出来)。我发现这是可行的:

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

${project.groupId}
应用程序
${project.version}
*
*

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

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


右键单击它->“排除Maven工件…”,Eclipse将为您进行排除,而无需找出lib链接的依赖项。

在一个类似问题中,我声明了所需的依赖项,并提供了范围。 使用这种方法,可以获取可传递的依赖项,但不包括在包阶段中,这正是您想要的。
在维护方面,我也喜欢这个解决方案,因为不需要维护pom,或者像whaley的解决方案那样定制pom;您只需在容器中提供特定的依赖项,即可完成

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

<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>

myApp
拉链
假的
*:struts2弹簧插件:jar:2.1.6
我建议使用的99版并不存在,但现在我找到了一个更好的方法,尤其是因为99版是离线的:

在项目的父POM中,如果不需要的依赖项潜入到构建中,则使用使构建失败。这可以使用插件的规则来完成:



详细信息。

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


xml API
xml API
[1.0,]
假如

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

我建议不要使用自己的pom来解决排除问题。这使得构建的可移植性大大降低,并降低了理解力。如果你没有超越公认的anwser:@JakubBochenski,我给出的答案是针对maven 2的,这就是这个问题的标签(在我写这篇评论时)。您的链接仅与maven 3相关。不管怎样,我已经编辑了我的答案,链接到投票率更高的答案。gr的*通配符
<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>
<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>
    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>