优秀的编程知识分享平台

网站首页 > 技术文章 正文

不会处理Maven依赖关系?看看我能不能帮助你

nanyue 2024-08-19 19:01:09 技术文章 6 ℃

依赖配置详解

首先要处理依赖,首先我们先要知道pom文件的依赖配置以及每个标签的含义是什么。

<project>
    ...
    <dependencies>
        <dependency>
            <!-- 坐标定位 -->
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <!-- 依赖类型(pom/jar/war/maven-plugin) -->
            <type>...</type>
            <!-- 作用域 -->
            <scope>...</scope>
            <!-- 是否可选 -->
            <optional>...</optional>
            <!-- 依赖排除 -->
            <exclusions>
                <exclusion>...</exclusion>
            </exclusions>
        </dependency>
        ...
    </dependencies>
    ...
</project>

依赖配置中除了构件的坐标信息(groupId、artifactId和version)之外,还有其他的元素。接下来就简单介绍一下这些元素的作用。

  • type:依赖的类型,同项目中的packaging对应。大部分情况不需要声明(默认是jar),当然type可选项有pom、jar、war、maven-plugin;
  • scope:依赖的范围选择,可选参数有:
  • compile:编译依赖范围(默认),全局有效
        test:测试依赖范围
        provided:已提供依赖范围,针对编译/测试有效
        runtime:运行时依赖,针对测试/运行时有效
        import:导入依赖范围,将其他模块定义好的dependencyManagement导入当前Maven项目pom的dependencyManagement中
  • optional:标记依赖是否可选(不建议配置),详情可以参考:http://c.biancheng.net/view/5005.html中搜索(2.可选依赖)关键字,下面有具体的说明(可以使用<dependencyManagement>和<pluginManagement>来替换该功能)。
  • exclusions:用于排除传递性依赖。

多模块依赖的统一管理

这个很简单,可以使用<dependencyManagement>标签和<pluginManagement>标签进行多模块依赖的统一管理,如下所示:

父模块pom配置

<?xml version="1.0"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    // ......
    <groupId>com.xxx</groupId>
    <artifactId>yyy</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>zzz</module>
        // ......
    </modules>
    // ......
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.16</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0.6</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.4</version>
            </dependency>
            // ......
    </dependencyManagement>
    // ......
</project>

子模块pom配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.xxx</groupId>
        <artifactId>yyy</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>zzz</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        //......
    </dependencies>
    // ......
</project>

MAVEN是如何对依赖冲突进行处理的?

Maven对依赖冲突的解决主要有两种方式:自动排除依赖和手动排除依赖。

自动排除依赖

首先Maven依赖处理原则有两个基本原则:一个是路径优先原则(最短路径选择);另一个是声明优先原则(最先声明选择)。当路径优先原则搞不定的时候,再使用声明优先原则。

路径优先原则:一个项目中对同一个包的引用,但是路径是有区别的,比如A->B->C(2.0.0),另一个是A->C(1.0.0)。由于路径优先原则,所以选择的是C(1.0.0)。

声明优先原则:一个项目中对同一个包的引用路径长度是一样的(A->B->C(2.0.0),A->D->C(1.0.0)),由于路径长度一样,这时候Maven会启用声明优先原则,选择先声明的C(2.0.0)。

手动排除依赖

一般情况下如果我们需要手动进行依赖的排除,可以使用<exclusions>标签进行排除。

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果我们需要直观地查看项目的依赖情况可以通过Idea提供的功能进行查看。

最近发表
标签列表