您的位置:

Maven查看依赖树

一、依赖树是什么?

在介绍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项目的依赖关系,提高开发效率。