一、依赖树是什么?
在介绍Maven查看依赖树之前,我们先来了解一下什么是依赖树。在Maven中,当我们在一个项目中引入外部依赖时,这些依赖项本身又可能引入其他的依赖项,这就形成了一个以当前项目为根节点的依赖树结构。如下图所示:
my-project ├── org.springframework:spring-context:jar:5.2.8.RELEASE:compile │ ├── org.springframework:spring-aop:jar:5.2.8.RELEASE:compile │ ├── org.springframework:spring-beans:jar:5.2.8.RELEASE:compile │ └── org.springframework:spring-core:jar:5.2.8.RELEASE:compile ├── org.springframework:spring-web:jar:5.2.8.RELEASE:compile │ └── org.springframework:spring-webmvc:jar:5.2.8.RELEASE:compile ├── org.springframework.security:spring-security-web:jar:5.3.5.RELEASE:compile │ ├── org.springframework.security:spring-security-core:jar:5.3.5.RELEASE:compile │ └── org.springframework:spring-expression:jar:5.2.8.RELEASE:compile └── org.slf4j:slf4j-log4j12:jar:1.7.30:compile └── log4j:log4j:jar:1.2.17:compile
上图展示了一个简单的依赖树结构,其中根节点为my-project,my-project依赖于四个直接子节点:spring-context、spring-web、spring-security-web和slf4j-log4j12。这些直接子节点又会继续引入其他的依赖项。
二、Maven查看依赖树可以干什么?
Maven查看依赖树的主要作用是帮助我们分析项目依赖关系,方便我们在引入新依赖时避免版本冲突甚至不必要的重复引入。下面就来介绍一下Maven查看依赖树功能的具体使用方法。
三、Maven查看依赖树的命令
我们可以通过Maven命令行工具的“mvn”命令来查看一个Maven项目的依赖树。具体命令如下:
mvn dependency:tree
执行这个命令后,Maven就会在控制台输出当前项目的依赖树结构。
$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------< com.example:my-project >------------ [INFO] Building my-project 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ my-project --- [INFO] com.example:my-project:jar:1.0-SNAPSHOT [INFO] \- org.springframework:spring-context:jar:5.2.8.RELEASE:compile [INFO] +- org.springframework:spring-aop:jar:5.2.8.RELEASE:compile [INFO] +- org.springframework:spring-beans:jar:5.2.8.RELEASE:compile [INFO] +- org.springframework:spring-core:jar:5.2.8.RELEASE:compile [INFO] \- org.springframework:spring-expression:jar:5.2.8.RELEASE:compile [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.748 s [INFO] Finished at: 2021-08-05T14:21:39+08:00 [INFO] ------------------------------------------------------------------------
四、Maven查看依赖树的输出内容
命令执行后,Maven会在控制台输出当前项目的依赖树结构,具体内容包括:
- 当前项目信息,包括项目名称、版本和构建类型等
- 依赖树结构,以树形结构展示当前项目的依赖关系
- 依赖关系信息,包括依赖包名称、版本和依赖范围等
五、依赖范围的含义
在依赖关系信息中,我们可以看到一个参数叫做“依赖范围”。依赖范围描述了当前依赖项被所依赖的项目使用的程度。具体的依赖范围包括:
- compile
- provided
- runtime
- test
- system
这些依赖范围的含义分别是:
- compile:默认的依赖范围,表示在编译、测试、执行时都需要使用这个依赖。
- provided:该依赖项在编译、测试中需要,但是在打包时不需要包含,因为在运行时由JDK或者服务器提供,比如servlet-api。
- runtime:该依赖项在编译时不需要,但是在测试和运行时需要,例如JDBC驱动。
- test:该依赖项只在测试时使用,不能在编译和运行时使用。
- system:该依赖项由系统提供,需要在POM文件中显示指定它的路径,一般不建议使用此依赖范围。
六、排除依赖的方法
Maven的依赖管理可以自动引入依赖包的版本,但是当同一项依赖被不同的模块引用时,版本冲突会导致编译失败或者运行时错误。在这种情况下,我们就需要指定排除某个模块的依赖。在POM文件中可以通过<exclusions>标签进行排除。例如:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.8.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> </exclusion> </exclusions> </dependency>
上述代码中,排除了spring-context依赖中的spring-security-core组件。
七、依赖树的过滤
在实际项目开发中,可能会遇到需要筛选特定依赖的需求。Maven提供了-d和-D两个参数用于过滤依赖树,具体含义如下:
- -D包含:只显示符合条件的依赖项。
- -D排除:不显示符合条件的依赖项。
- -D输出类型:以文本方式输出或者以DOT格式输出(便于绘制依赖图)。
具体命令如下:
mvn dependency:tree -Dincludes=groupId:artifactId:version
其中,includes参数表示指定需要包含的依赖,可以指定groupId、artifactId、version等多个条件,各个条件之间使用冒号隔开,例如:
mvn dependency:tree -Dincludes=org.springframework:spring-web,com.google.guava:*
上述命令的含义是,只显示groupId为org.springframework且artifactId为spring-web或者groupId 为com.google.guava的依赖。
八、结语
本文主要介绍了Maven查看依赖树的相关知识,包括了依赖树的概念、命令、输出内容、依赖范围、排除依赖和依赖树的过滤等方面。掌握了这些知识,我们可以更加方便快捷地管理Maven项目的依赖关系,提高开发效率。