0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Maven命令检测重复的依赖关系

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-07 16:36 次阅读

在我们平时的开发过程中,常常会遇到引入各种不同的 jar 包,然后引发的 Maven 依赖冲突,今天我们来学习下如何使用 Maven 命令检测 pom.xml 中的重复依赖项。

为什么要检测重复的依赖关系

pom.xml中, 经常引入各种不同的jar 包, 又会依赖其他的jar。特别是一些常用的工具库,比较容易出现版本冲突,例如,让我们看下这个pom.xml

< project >
  [...]
  < dependencies >
    < dependency >
      < groupId >org.apache.commons< /groupId >
      < artifactId >commons-lang3< /artifactId >
      < version >3.12.0< /version >
    < /dependency >
    < dependency >
      < groupId >org.apache.commons< /groupId >
      < artifactId >commons-lang3< /artifactId >
      < version >3.11< /version >
    < /dependency >
  < /dependencies >
   [...]
< /project >

从上面的代码中,commons-lang3 被引用了两次,而且版本号也不一样。现在我们就来看看如何使用Maven命令来检测这些重复的依赖关系。

依赖树命令

让我们在终端运行 mvn dependency:tree的命令,看看输出结果

$ mvn dependency:tree
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.javanorth:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -------------< com.javanorth:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-duplicate-dependencies ---
[WARNING] The artifact xml-apis:xml-apis:jar:2.0.2 has been relocated to xml-apis:xml-apis:jar:1.0.b2
[INFO] com.javanorth:maven-duplicate-dependencies:jar:0.0.1-SNAPSHOT
[INFO] - org.apache.commons:commons-lang3:jar:3.11:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.136 s
...

我们可以看到,commons-lang3 jar的3.11版和 3.12 版同时被引入进来了,出现这种情况是因为Maven选择了pom.xml中后来出现的依赖。

依赖关系analyze-duplicate命令

现在让我们运行 mvn dependency:analyze-duplicate,看看输出输出结果。

$ mvn dependency:analyze-duplicate
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.javanorth:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] -------------< com.javanorth:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:analyze-duplicate (default-cli) @ maven-duplicate-dependencies ---
[WARNING] The artifact xml-apis:xml-apis:jar:2.0.2 has been relocated to xml-apis:xml-apis:jar:1.0.b2
[INFO] List of duplicate dependencies defined in < dependencies/ > in your pom.xml:
        o org.apache.commons:commons-lang3:jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.835 s
。。。

我们注意到,WARNINGINFO日志语句都提到了重复依赖的存在。

如果存在重复的依赖,则构建失败

在上面的例子中,我们看到了如何检测重复的依赖关系,但BUILD仍然是成功的,但这可能导致使用了不正确的 jar 版本。

使用[Maven Enforcer Plugin](https://maven.apache.org/enforcer/maven-enforcer-plugin/index.html),我们可以确保在存在重复依赖的情况下构建不成功。

我们需要在pom.xml中加入这个Maven插件,并加入banDuplicatePomDependencyVersions规则。

< project >
  [...]
  < build >
    < plugins >
      < plugin >
        < groupId >org.apache.maven.plugins< /groupId >
        < artifactId >maven-enforcer-plugin< /artifactId >
        < version >3.0.0< /version >
        < executions >
          < execution >
            < id >no-duplicate-declared-dependencies< /id >
            < goals >
              < goal >enforce< /goal >
            < /goals >
            < configuration >
              < rules >
                < banDuplicatePomDependencyVersions/ >
              < /rules >
            < /configuration >
          < /execution >
        < /executions >
      < /plugin >
    < /plugins >
  < /build >
  [...]
< /project >

现在,该规则约束了我们的Maven构建。

$ mvn verify
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.javanorth:maven-duplicate-dependencies:jar:0
.0.1-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: org.apache.commons:commons-lang3:jar -
> version 3.12.0 vs 3.11 @ line 14, column 14
[WARNING]
[INFO] -------------< com.javanorth:maven-duplicate-dependencies >--------------
[INFO] Building maven-duplicate-dependencies 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-enforcer-plugin:3.0.0:enforce (no-duplicate-declared-dependencies) @ maven-duplicate-dependencies ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 1 duplicate dependency declaration in this project:
 - dependencies.dependency[org.apache.commons:commons-lang3:jar] ( 2 times )

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0:enforce (no-duplicate-declared-dependencies) on project maven-duplicate-dependencie
s: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.

删除重复的依赖关系

只要确定了重复的依赖关系,我们就需要在 pom.xml中删除它们,只保留那些我们项目使用的唯一依赖关系。

总结

本文中,我们学习了如何使用mvn dependency:treemvn dependency:analyze-duplicate命令检测Maven中的重复依赖,还学习了如何使用Maven Enforcer插件,通过应用内置规则使包含重复依赖的构建失败。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发
    +关注

    关注

    0

    文章

    363

    浏览量

    40785
  • 日志
    +关注

    关注

    0

    文章

    138

    浏览量

    10623
  • maven
    +关注

    关注

    0

    文章

    30

    浏览量

    3695
收藏 人收藏

    评论

    相关推荐

    Maven依赖冲突的几种常用方法

    Maven依赖冲突是一个很常见的问题,它通常发生在项目中有多个依赖包含相同库的不同版本时。我这边解决Maven依赖冲突的几种常用方法如下:
    的头像 发表于 09-30 11:11 831次阅读
    <b class='flag-5'>Maven</b><b class='flag-5'>依赖</b>冲突的几种常用方法

    关系代数和数据依赖概念

    关系代数和数据依赖概念 1 关系代数    1970年IBM公司的E.F.Cood博士在论文“一个通用关系式数据库系统的模型”中首先提出了
    发表于 12-05 21:28

    怎么解决依赖关系中vi冲突?

    冲突项是Error Cluster From Error Code.vi。如果不在依赖关系中可以放进项目库中来解决同名冲突。在依赖关系中怎么解决?大神指教
    发表于 09-25 21:14

    Maven 配置指南

    Maven 配置指南http://bbs.edu118.com/forum.php?mod=viewthread&tid=263&fromuid=231(出处: 信盈达IT技术社
    发表于 08-28 15:08

    Linux下的Maven安装方法

    关键步骤如下: 1. 下载Maven包. 2. 解压Maven包. 3.配置Maven系统参数,验证Maven是否正确安装.
    发表于 07-23 08:01

    OK3399开发板的程序的库依赖关系是什么?

    我想知道OK3399开发板的程序的库依赖关系,发现objdump 、ldd、readelf、apt等命令都没有,还有办法查看吗?
    发表于 12-30 07:31

    CAD中如何快速重复执行命令

    快速重复执行命令主要是靠鼠标右键或者是键盘上的空格以及上下方向键。 输入OP命令打开选项对话框,点用户系统配置选项卡自定义右键单击按钮,默认模式下无论是否选定对象,单
    发表于 10-23 17:04 1608次阅读

    MyEclipse环境搭建Maven的开发环境

    一:Maven的下载安装 1、安装环境:win7 旗舰版 + MyEclipse2014 2、前置条件:JDK (本人用的jdk1.8) 3、maven下载: 说明:maven依赖于j
    发表于 11-28 16:13 1359次阅读

    基于变量依赖关系模型的变量重要性度量综述

    基于变量依赖关系模型的变量重要性度量综述
    发表于 07-02 14:44 0次下载

    如何在IDEA中查看依赖关系

    Maven提供了mvn dependency:tree来查看依赖关系,而IDE往往提供了更加便利的方式,比如Eclipse或者IDEA都有类似的功能,这篇文章简单说明一下如何在IDEA中查看
    的头像 发表于 10-17 09:48 1.9w次阅读

    如何理解Maven拉包原理,搞定Maven构建项目

    依赖是我们在使用 Maven 构建项目时最常使用的功能,通过依赖标签,我们可以直接从Maven仓库中引入对应的Jar包,无需手动再将Jar添加到目录下了,可谓是十分方便,不过我们除了使
    发表于 05-25 09:50 544次阅读
    如何理解<b class='flag-5'>Maven</b>拉包原理,搞定<b class='flag-5'>Maven</b>构建项目

    idea配置了maven但不显示pom

    配置 Maven 是一个开发者常见的任务,通过 Maven 可以更方便地管理项目依赖和构建过程。在配置 Maven 的过程中,我们可能会遇到一些问题,比如没有正确显示 pom 文件。本
    的头像 发表于 12-06 14:17 2696次阅读

    idea中maven无法解析插件是怎么回事

    Maven是一个软件项目管理和理解工具,它使用一个项目对象模型(POM)文件来描述项目的结构和依赖关系Maven的目标是简化项目的构建过程,提高开发人员的效率。 在
    的头像 发表于 12-06 14:18 5694次阅读

    idea如何添加maven

    Maven是一个开源的项目管理工具,它提供了一种简单的方式来管理项目的依赖关系、构建过程和发布部署。本文将详细介绍如何将Maven添加到你的项目中,并使用它来管理你的项目。 第一步:安
    的头像 发表于 12-06 14:56 1116次阅读

    云服务器的maven怎么配置本地仓库?

    在云服务器上使用Maven时,你可以配置本地仓库以缓存和管理依赖项,以减少对中央仓库的依赖和加快构建过程。以下是配置Maven本地仓库的步骤: 1、选择本地仓库路径: 在云服务器上选择
    的头像 发表于 02-22 16:59 461次阅读