2009-02-13 108 views
175

在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贡献。

有没有办法使用某种通配符来一次排除所有传递依赖关系而不是一个接一个?

+0

有时我们需要使用Spring 2.5.6的最新版本的库,但其他一些依赖包括旧版本,例如struts2-spring-plugin(2.1.6)包含Spring 2.5.3。在这种情况下,需要排除或覆盖版本。 – 2009-04-28 20:49:05

+0

使用常春藤。开玩笑。 – 2014-05-07 21:59:22

回答

38

对于maven2,没有办法做你所描述的。对于maven 3,有。如果您使用的是maven 3,请参阅another answer for this question

对于maven 2,我建议您为依赖关系创建自己的自定义pom,其中包含<排除项>。对于需要使用该依赖项目的项目,请将依赖项设置为您的自定义pom,而不是典型的工件。虽然这并不一定允许您排除所有传递依赖关系,排除<排除>,但它确实允许您只需编写一次依赖项,而且所有项目都不需要维护不必要的长排除列表。

+12

我建议不要让自己的pom解决排除问题。这使得你的构建更加便携,并减少了理解。 – 2009-04-12 01:52:14

+1

如果你不看过去接受的anwser:http://jira.codehaus.org/browse/MNG-3832 – 2015-03-17 20:39:45

+0

@JakubBochenski我给出的答案是特定于maven 2,这是这个问题的标签是什么(当时我写这个评论)。您的链接仅适用于maven 3.无论如何,我已经编辑了我的答案,链接到更高级的答案。 – whaley 2015-03-17 23:50:47

3

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

如果您需要从每个依赖项中排除特定工件(例如commons-logging),则Version 99 Does Not Exist方法可能会有所帮助。


更新2012:不要使用这种方法。使用maven-enforcer-plugin and exclusions。版本99会产生伪造依赖关系,并且版本99存储库处于脱机状态(有similar mirrors,但您不能依赖它们永远保持联机状态;最好仅使用Maven Central)。

-3

您可以使用排除,但你必须手动列出需要排除的每一个依赖...

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

干得好,你已经成功地重复了这个问题。 – thecoshman 2013-12-05 11:19:10

6

有解决类似的问题,如果你依赖的范围设定为运行,及物DEP将被排除在外。虽然请注意,这意味着如果要打包运行时依赖关系,则需要添加其他处理。

要在任何打包中包含运行时依赖项,您可以使用maven-dependency-plugin的copy goal for a specific artifact

29

一两件事,我发现有用:

如果你把在任何您的项目父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将同时指定版本和排除。我几乎将所有这些技术用于我们的项目,并消除了很多重复。

219

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

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

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

两个groupId和artifactId的通配符排除,通常会通过传播到使用这种依赖的模块的所有依赖关系。

3

如果你的Eclipse下开发,就可以在POM编辑器(启用了高级选项卡)为您要排除的项目,然后的依赖性依赖图看:

右击它 - >“排除的Maven Artifact ...“,并且Eclipse将为您排除这些内容,而无需查明lib链接的依赖关系。

1

在一个类似的问题中,我有所需的依赖声明与提供的范围声明。 通过这种方法,可以获取传递依赖关系,但不包含在包阶段,这正是您想要的。 我也喜欢这个解决方案的维护方面,因为在whaley的解决方案中没有pom或自定义pom需要维护;您只需要在容器中提供特定的依赖关系并执行

6

如果您需要从要包括在程序集中的依赖项工件中排除所有传递性依赖项,则可以在该程序集的描述符中指定此属性-plugin:

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

Three years ago我建议使用版本99不存在,但现在我已经想出一个更好的办法,特别是因为版本99离线:

在项目的父POM,使用maven-enforcer-plugin如果不必要的依赖陷入,就会失败构建。这可以通过使用插件的banned dependencies规则来执行:

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

然后当,提醒你有关的不必要的依赖,排除它在父POM的<dependencyManagement>部分:

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

这样,不需要依赖赢得” (与<exclusion>不同,它很容易被忽略),即使在编译期间它也不可用(与provided作用域不同),不存在假依赖(不像99版本),它不需要定制存储库(与版本99不同)。这种方法甚至可以基于工件的版本,分类器,范围或整个groupId - see the documentation获取详细信息。

7

我使用下面的解决方法:而不是试图排除在所有适当的依赖关系中的工件,我将依赖关系作为“提供”在顶层绘制。 例如,为了避免航运XML的API“任何版本”:

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

使用在类路径中最新的行家。它会删除重复的文物和保持最新的Maven构件..