2016-03-11 100 views
4

我遇到了JIRA post,它给出了一个解决方案,在POM的每个依赖标签中包含排除标签。如何关闭maven项目的传递依赖关系?

但我有大量的项目,每个项目都有大量的依赖标签。将这个<exclusion>包含在每个依赖关系标记中是不可行的。

问题:有没有办法在全球范围内关闭Maven中传递依赖的进口?

+0

但是,为什么要为所有项目的所有依赖关系提供这样的机制?在这种情况下,蚂蚁可能是更好的选择。否则,脚本可以完成这项工作,但它很容易成为维护噩梦ihmo。 –

+0

出于安全考虑,我们需要这样做。我们有一个Artifactory回购站,我们维护所有且只需要的依赖关系。我们不希望不必要的依赖性蔓延到包中。我很想知道你所指的蚂蚁脚本会做什么。你能解释一下这个解决方案吗?它是否与POM上的文本替换相同? – AshwiniR

+0

但是,离线切换Artifactory并不容易,因此您可以完全控制其内容?我的意思是ant,因为你使用物理文件作为依赖关系,而不是声明和传递式管理,所以你可以完全控制你正在使用的东西。我想到的脚本可能与下面解释的解决方案的确如此。 –

回答

3

在Maven中你不能在一个单一的方式关闭传递依赖的所有声明依赖性,如official documentation

为什么排除规则在每个依赖基础上进行,而不是在POM水平

这主要是为了确保依赖关系图是可预测的,并保持继承效应不排除不应排除的依赖关系。如果你接触到最后的手段并且必须排除,你应该完全确定你的哪个依赖引入了这种不需要的传递依赖。


实际上,由于Maven的3.2.1你可以指定通配符来排除所有传递依赖于特定的相关性,但是这仍然是每依赖,而不是全球性的。

你真正想拥有像每一个的每以下,并在每个每个依赖和每一个POM(!!)什么:

<dependency> 
    <groupId>groupId</groupId> 
    <artifactId>artifactId</artifactId> 
    <version>version</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

虽然这是不可取的,因为它可能很容易(和负面的)影响有关项目的可维护性,一个可能的解决方案将是对所有有关项目的共同parent POM,让每个POM将宣布:

<parent> 
    <groupId>com.sample</groupId> 
    <artifactId>projects-governance</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

然后,在相关父POM你会:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sample</groupId> 
    <artifactId>modules</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <dependencyManagement> 
     <dependencies> 
      <!-- for each and every foreseen dependency of children poms --> 
      <dependency> 
       <groupId>groupId</groupId> 
       <artifactId>artifactId</artifactId> 
       <version>version</version> 
       <exclusions> 
        <exclusion> 
         <groupId>*</groupId> 
         <artifactId>*</artifactId> 
        </exclusion> 
       </exclusions> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 
</project> 

注意dependencyManagement部分,在这里我们要说:一切为了孩子的POM,只要您使用有关的依赖我宣布,这个groupId和这个artifacId默认情况下这个版本,这排除将被应用。

这个解决方案的主要优点是你集中了这个机制/管理,至少你不必碰每个POM(除了关于新父母的变化)。

但是,您仍然需要在父POM中列出所有项目使用的所有依赖项,并为所有项目应用通配符排除。


要获得每个项目的所有依赖关系列表,您可以使用手动方法(打开每个POM!),或在每个项目上运行以下命令:然后

mvn dependency:list -DexcludeTransitive=true -DoutputFile=dependencies.txt -DappendOutput=true 

Maven Dependency Plugin将在指定的dependencies.txt文件写声明的依赖性(在相关项目的格式groupId:artifactId:packaging:version:scope)。请注意,最后一个参数appendOutput可能有助于在同一个文件的末尾写入,以便将它们集中进行进一步处理(删除重复项,并将它们移动到新父项目)。


要应用通配符的所有声明的依赖性,快速提示是简单地取代(通过shell脚本任何文本编辑器或)以下令牌:

</version> 
</dependency> 

通过以下的:

</version> 
    <exclusions> 
     <exclusion> 
      <groupId>*</groupId> 
      <artifactId>*</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

然后保存该文件。并且自动地以一种相当安全的方式将通配符排除应用于所有的依赖关系。

OP更新:最后,我们决定不这样做,而是通过使用依赖关系树命令为每个项目生成新添加/删除的依赖关系的报告并将其广播,从而解决原始问题。

+0

我通读了官方文档。谢谢。他们更多地从用户定义的项目视图中进行说明但我更关心的是Maven从它的中央存储库中抽取的工件。这种方法最终也是我想到的。猜猜必须这样做.. – AshwiniR