转载maven的mvn dependency依赖分析和常用命令介绍 - 简书

maven的mvn dependency依赖分析和常用命令介绍

在项目开发过程中,我们经常会有分析项目依赖的需要,查找jar依赖路径,查找jar冲突等等。这时候,dependency命令会非常的有用,在此我们介绍下关于maven的dependency命令的一些用法。

1. mvn dependency:list ---- 列出项目的所有jar包

mvn dependency:list -Dverbose
该命令可以列出项目依赖的所有jar包,-Dverbose参数会把被忽略的jar,即相同jar包的不同版本引入也列出来。
输出示例:

[INFO]    org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO]    org.hibernate.validator:hibernate-validator:jar:6.0.9.Final:compile
[INFO]    com.fasterxml.jackson.core:jackson-core:jar:2.9.5:compile
[INFO]    com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.5:compile
[INFO]    org.springframework:spring-expression:jar:5.0.6.RELEASE:compile
[INFO]    org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE:compile
[INFO]    org.springframework.boot:spring-boot-starter-logging:jar:2.0.2.RELEASE:compile
[INFO]    org.yaml:snakeyaml:jar:1.19:runtime
[INFO]    org.springframework.boot:spring-boot:jar:2.0.2.RELEASE:compile
[INFO]    junit:junit:jar:3.8.1:test

2. mvn dependency:tree ---- 列出项目的包依赖树

mvn dependency:tree -Dverbose
这个命令跟上一个命令的区别就是,这个命令的依赖,输出来是个树,更方便看依赖关系。
输出示例:

[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.0.2.RELEASE:compile
[INFO]    +- org.springframework.boot:spring-boot-starter:jar:2.0.2.RELEASE:compile
[INFO]    |  \- org.springframework:spring-core:jar:5.0.6.RELEASE:compile
[INFO]    |     \- org.springframework:spring-jcl:jar:5.0.6.RELEASE:compile
[INFO]    +- org.springframework:spring-web:jar:5.0.6.RELEASE:compile
[INFO]    |  \- org.springframework:spring-beans:jar:5.0.6.RELEASE:compile
[INFO]    \- org.springframework:spring-webmvc:jar:5.0.6.RELEASE:compile
[INFO]       +- org.springframework:spring-aop:jar:5.0.6.RELEASE:compile
[INFO]       +- org.springframework:spring-context:jar:5.0.6.RELEASE:compile
[INFO]       \- org.springframework:spring-expression:jar:5.0.6.RELEASE:compile

dependency:tree有几个比较重要的参数,非常有用:

  • includes

    • 说明:该参数可以列出指定要求的jar,其他的忽略
    • 示例:-Dincludes=velocity:velocity,只列出velocity的依赖关系
    • 参数值:[groupId]:[artifactId]:[type]:[version],参数格式就是这样的,没有的值可以留空,举例-Dincludes=:spring-aop-Dincludes=:::5.0.6.RELEASE-Dincludes=org.springframework
    • 通配符:在参数中可以使用通配符,例如org.apache.*:::*-SNAPSHOT
    • 多个参数值:参数后面可以跟多个参数值,以英文逗号分隔,举例-Dincludes=org.apache.maven*,org.codehaus.plexus
  • excludes
    • 说明:该参数的用法跟includes是一样的,不过这个参数的作用是排除指定的jar

示例:查看包冲突

比如我们查看一下commons-collections包的冲突
命令:
mvn dependency:tree -Dverbose -Dincludes=commons-collections
输出:

[INFO] [dependency:tree]
[INFO] org.apache.maven.plugins:maven-dependency-plugin:maven-plugin:2.0-alpha-5-SNAPSHOT
[INFO] +- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:compile
[INFO] |  \- commons-validator:commons-validator:jar:1.2.0:compile
[INFO] |     \- commons-digester:commons-digester:jar:1.6:compile
[INFO] |        \- (commons-collections:commons-collections:jar:2.1:compile - omitted for conflict with 2.0)
[INFO] \- org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-8:compile
[INFO]    \- org.codehaus.plexus:plexus-velocity:jar:1.1.3:compile
[INFO]       \- commons-collections:commons-collections:jar:2.0:compile

我们可以看到,2.1版本的jar被忽略掉了,因为maven是根据路径最近原则来解析依赖,2.0版本路径更短,所以2.0版本被引入,2.1版本路径比2.0要长,所以被忽略。
使用这个命令可以轻松的查看包的引入路径,包的冲突情况。
此处一定不要省略-Dverbose参数,要不然是不会显示被忽略的包

3. dependency:analyze-only ---- 分析依赖

dependency:analyze-only命令可以分析整个项目,并且找出项目中依赖有如下情况的:

  • 声明了并且使用了的依赖
  • 没有声明但是使用了的依赖
  • 声明了但是没有使用的依赖

输出示例:

[INFO] Used declared dependencies found:
[INFO]    cn.hutool:hutool-all:jar:4.3.1:compile
[INFO]    com.google.guava:guava:jar:27.0.1-jre:compile
[WARNING] Used undeclared dependencies found:
[WARNING]    org.slf4j:slf4j-api:jar:1.7.25:compile
[WARNING]    org.springframework:spring-context:jar:4.3.22.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:1.5.19.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot:jar:1.5.19.RELEASE:compile
[WARNING]    org.springframework:spring-beans:jar:4.3.22.RELEASE:compile
[WARNING]    junit:junit:jar:4.12:test
[WARNING] Unused declared dependencies found:
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:1.5.19.RELEASE:test
[WARNING]    com.h2database:h2:jar:1.4.197:test
[WARNING]    org.springframework.boot:spring-boot-starter:jar:1.5.19.RELEASE:compile
[WARNING]    com.fasterxml.jackson.core:jackson-databind:jar:2.8.11.3:compile
[WARNING]    org.projectlombok:lombok:jar:1.16.22:compile
[WARNING]    com.alibaba:fastjson:jar:1.2.55:compile

需要注意的是,如果你要查看声明了并且使用了的依赖,必须加上参数-Dverbose

4. dependency:analyze-duplicate ---- 分析<dependencies/> 和<dependencyManagement/>

这个命令会查找<dependencies/> 和 <dependencyManagement/>中重复声明的依赖

5. dependency:list-repositories ---- 列出所有的远程repositories

命令:
mvn dependency:list-repositories

输出:

[INFO]        id: sonatype-nexus-snapshotsurl: https://oss.sonatype.org/content/repositories/snapshotslayout: default
snapshots: [enabled => true, update => daily]releases: [enabled => false, update => daily][INFO]        id: apache.snapshotsurl: https://repository.apache.org/snapshotslayout: default
snapshots: [enabled => true, update => daily]releases: [enabled => false, update => daily][INFO]        id: centralurl: https://repo.maven.apache.org/maven2layout: default
snapshots: [enabled => false, update => daily]releases: [enabled => true, update => daily]

6. dependency:purge-local-repository ---- 清理本地repository

这个命令的会首先解析整个项目的依赖,然后从本地repository中清理这些依赖,重新从远程repository下载。

  • 直接依赖
    有一点要说清楚,这个命令默认的对所有的依赖项进行操作。所以它会在清除操作之前,下载某些缺失的依赖来收集完整的依赖树信息。为了避免这些预下载的操作,你可以设置参数-DactTransitively=false,仅对项目的直接依赖进行操作。
  • 指定/排除依赖
    你也可以有针对性的只操作某些包,需要添加参数-Dincludes,明确的声明包,这个是可以传多个值的,用英文逗号分隔,举例:dependency:purge-local-repository -Dincludes=org.slf4j:slf4j-api,org.slf4j:log4j-over-slf4j-Dexcludes也是一样的道理,只不过是排除某些依赖。
  • 自定义清理
    如果你想清理不在本项目中的依赖,也可以使用这个,不过参数是不一样的。mvn dependency:purge-local-repository -DmanualIncludes=org.apache:apache,参数-DmanualInclude可以让你清理不在本项目中的依赖,但是不会重新解析依赖了,因为本项目不需要这些依赖。这个对清理parent pom,导入的pom,maven插件非常有用。

maven获取所有依赖项相关推荐

  1. 如何使用Maven创建具有依赖项的可执行JAR?

    我想将我的项目打包在一个可执行的JAR中进行分发. 如何使Maven项目将所有依赖项JAR打包到我的输出JAR中? #1楼 刘坚认为是对的. Maven依赖插件允许您扩展所有依赖,然后可以将其视为资源 ...

  2. java如何配置maven路径_如何配置Eclipse构建路径以使用Maven依赖项?

    我想利用Maven提供的功能来管理项目中的依赖项 . 我对Maven如何工作的简要理解是,它将获取所需的JAR,然后使用这些库构建项目 . 目前我有一个简单的POM文件设置为测试: xmlns:xsi ...

  3. idea运行maven项目依赖项scope:provided时启动报错NoClassDefFoundError解决

    现象 maven项目的依赖项scope为provided时,表示此以来项目由运行环境提供,开发时直接启动可能会报NoClassDefFoundError异常 Idea版本 2021.3 (其他版本类似 ...

  4. maven mockito_如何:测试Maven项目(JUnit,Mockito,Hamcrest,AssertJ)中的依赖项

    maven mockito 对于当今的大多数Java项目而言,JUnit本身还远远不够. 您还需要一个模拟库,也许还有其他东西. 在此迷你操作指南中,我介绍了可以在新的Java项目中开始的测试依赖项. ...

  5. 将JAR依赖项添加到Eclipse插件Maven Tycho构建

    开发OPP项目时,一直困扰着我的是使用硬编码Java库依赖项. 我手动下载了所用库的jar ,将其复制到需要它们的插件中的目录中,然后将其添加到MANIFEST.MF文件中. 您可能会问我为什么要这样 ...

  6. maven 构建依赖树_Maven构建依赖项

    maven 构建依赖树 熟悉发行版和快照依赖关系的Maven和Gradle用户可能不了解TeamCity快照依赖关系,或者假定他们与Maven相关(这是不正确的). 熟悉工件和快照相关性的TeamCi ...

  7. Maven排除所有传递依赖项

    " 传递依赖项是Maven 2.0中的新功能. 这样一来,您就可以避免发现和指定自己的依赖项所需的库,并自动将它们包括在内." 我遇到了一个问题,其中一些依赖项在运行时可用,但在公 ...

  8. 如何:在Maven项目(JUnit,Mockito,Hamcrest,AssertJ)中测试依赖项

    对于当今的大多数Java项目,JUnit本身还远远不够. 您还需要一个模拟库,也许还有其他东西. 在此迷你操作指南中,我介绍了可以在新的Java项目中开始的测试依赖项. 一切都始于JUnit Mave ...

  9. Maven构建依赖项

    熟悉发行版和快照依赖项的Maven和Gradle用户可能不了解TeamCity快照依赖项,或者认为他们与Maven相关(这是不正确的). 熟悉工件和快照依赖关系的TeamCity用户可能不知道,除了T ...

最新文章

  1. windows server 2008设置远程桌面连接最大数量
  2. mysql workbench 在模板与数据库间同步
  3. uboot启动linux,uboot中ramdisk启动linux的两种方法
  4. JDK1.8日期的使用(转)
  5. [转载] 一文彻底搞懂父类引用指向子类对象问题
  6. springboot 创建地址_使用 SpringBoot Admin监控Spring Boot 服务
  7. php时间跨度,在PHP中执行与日期时间相关的操作
  8. LNMP搭建论坛(php)
  9. 前端基础8:HTML5新增标签及CSS3新属性 viewport 动画
  10. 理工科常用的学习工具
  11. HDOJ水题集合1:最小生成树(Kruskal)
  12. 用L2TP与OpenSwan构建IPSec ×××(使用X.509证书认证)
  13. js实现无刷新表单提交文件,将ajax请求转换为form请求方法
  14. java编写万年历的报告,用java编写的万年历代码
  15. FreeImage通用图像加载实现
  16. mysql 查找入职时间最早_(2)查找入职员工时间排名倒数第三的员工所有信息...
  17. Windows 10 error code 0x80072efd
  18. 【软考系统架构设计师】复盘架构设计师真题知识点第二十五章---企业信息化战略
  19. 1、蛋白质二级结构预测方法
  20. java中的消息提示框

热门文章

  1. 计算机打印unknow,系统安装打印机驱动提示unknown device解决方法
  2. 四象限运行模式_双向可控硅四象限触发方式介 - 双向可控硅四象限触发方式介绍_双向可控硅触发电路的设计...
  3. git 移除项目版本控制_Git - 关于版本控制
  4. LTE学习笔记--LTE无线连接过程--UE Attach过程和Detach过程
  5. C语言串的基本操作(assign,compare,concat,index,insert,delete,replace)
  6. C语言fscanf函数的理解
  7. 88 Three.js 导入FBX格式骨骼绑定模型
  8. excel拆分数据为多个工作表
  9. 1.1 统计学习方法的定义与分类
  10. Matlab将连续图片处理为视频