当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《排除单个依赖项的所有传递依赖项》经验,为你挑选了8个好方法。

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


  sample.group
  sample-artifactB
  1
   
     
       sample.group
       sample-artifactAB
     
   

这种方法的问题在于我必须为每个由此贡献的传递依赖项执行此操作sample-artifactB.

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



1> 小智..:

对我有用的东西(可能是Maven的新功能)仅仅是在排除元素中做通配符.

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


    ${project.groupId}
    app
    ${project.version}
    
        
            *
            *
        
    

groupId和artifactId上的通配符排除了通常使用此依赖关系传播到模块的所有依赖项.


此方法有效.他们修复了其他人在maven 3.2.1中报告的警告:https://issues.apache.org/jira/browse/MNG-3832
我不知道你是如何找到这个工作的,因为Maven 3明确警告使用星号:[警告]对于的'dependencies.dependency.exclusions.exclusion.groupId'值为"*"不匹配有效的ID模式.[警告]强烈建议修复这些问题,因为它们会威胁构建的稳定性.[警告]因此,未来的Maven版本可能不再支持构建此类格式错误的项目您是否愿意提供一些支持并可以使用的证据?否则我会认为你的评论极具误导性.
组和artifiact的*通配符似乎在maven 3中工作
使用Maven 3.0.4精心工作.非常感谢*!

2> whaley..:

对于maven2,没有办法做你所描述的.对于maven 3,有.如果您使用的是maven 3,请参阅此问题的另一个答案

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


我建议不要让你自己的pom来解决排除问题.这使您的构建变得不那么便携并且降低了理解力.

3> Joshua Davis..:

我觉得有用的一件事:

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

例如,如果您的父POM具有:


    
    ...         
        
            commons-fileupload
            commons-fileupload
            1.2.1
            
                
                    junit
                    junit
                
            
        
     ....
  

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

        
            commons-fileupload
            commons-fileupload
        

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



4> Esko Luontol..:

三年前我建议使用版本99不存在,但现在我想出了一个更好的方法,特别是因为版本99离线:

在项目的父POM中,如果不需要的依赖项进入构建,则使用maven-enforcer-plugin使构建失败.这可以使用插件的禁止依赖关系规则来完成:


    maven-enforcer-plugin
    1.0.1
    
        
            only-junit-dep-is-used
            
                enforce
            
            
                
                    
                        
                            junit:junit
                        
                    
                
            
        
    

然后,当它提醒您有关不需要的依赖项时,请在父POM的部分中将其排除:


    org.springframework.batch
    spring-batch-test
    2.1.8.RELEASE
    
        
            junit
            junit
        
    

这样就不会意外地显示不需要的依赖(不像只是容易忘记的那样),即使在编译时也不可用(与provided范围不同),没有伪造的依赖(不像版本99)而且它'没有自定义存储库(与版本99不同).这种方法甚至可以基于工件的版本,分类器,范围或整个groupId工作 - 有关详细信息,请参阅文档.



5> Michael Zilb..:

我使用以下解决方法:而不是尝试在所有适当的依赖项中排除工件,我将依赖项绘制为顶层的"提供".例如,为了避免运送xml-apis"任何版本":

    
        xml-apis
        xml-apis
        [1.0,]
        provided
    



6> Peter..:

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

https://issues.apache.org/jira/browse/MNG-2315



7> Rich Seller..:

有一种解决方法,如果将依赖关系的范围设置为运行时,将排除传递依赖关系.虽然请注意,这意味着如果要打包运行时依赖项,则需要添加其他处理.

要在任何打包中包含运行时依赖项,可以将maven-dependency-plugin的复制目标用于特定工件.



8> Superole..:

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


    myApp
    
        zip
    
    
        
            false
            *:struts2-spring-plugin:jar:2.1.6
        
    

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有