zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Maven - 实例-5-依赖冲突

2023-09-14 08:59:09 时间

避免依赖冲突的原则

如果项目中的pom.xml没有指定依赖的信息,而是通过继承来引用依赖,则很有可能发生继承同一个依赖的多个版本,从而产生依赖冲突。

Maven通过如下两个原则来避免依赖冲突:

1- 短路优先

  • A可间接通过B和C引用到X:A--->B--->C---->X(jar)
  • A可通过间接通过D引用到X:A--->D--->X(jar) 实际此路径的X被引用

2- 先声明先优先
如果路径长度相同,则谁先声明,先解析谁。

注意:这里的依赖冲突是指同一依赖的不同版本的冲突。

示例

使用已建立的aaa、bbb、ccc、ddd四个Maven项目,分别更改pom.xml内容
依赖关系如下:

  • aaa依赖commons-io 2.6插件
  • bbb依赖aaa,依赖commons-io 2.2插件
  • ccc依赖bbb
  • ddd依赖aaa和bbb,先声明aaa

aaa

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.AAA</groupId>
  <artifactId>aaa</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>aaa</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
  </dependencies>
</project>

bbb

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.BBB</groupId>
  <artifactId>bbb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>bbb</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.AAA</groupId>
      <artifactId>aaa</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.2</version>
    </dependency>    
  </dependencies>
</project>

ccc

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.CCC</groupId>
  <artifactId>ccc</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>ccc</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.BBB</groupId>
      <artifactId>bbb</artifactId>
      <version>0.0.1-SNAPSHOT</version>       
    </dependency> 
  </dependencies>
</project>

ddd

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.DDD</groupId>
  <artifactId>ddd</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>ddd</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.AAA</groupId>
      <artifactId>aaa</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>    
    <dependency>
      <groupId>testDep.BBB</groupId>
      <artifactId>bbb</artifactId>
      <version>0.0.1-SNAPSHOT</version>       
    </dependency>     
  </dependencies>
</project>

验证示例结果

实际依赖关系:
ccc---》bbb---》commons-io 2.2 插件 短路优先
ccc---》bbb---》aaa---》commons-io 2.6 插件

ddd---》aaa---》commons-io 2.6 插件 先声明先优先
ddd---》bbb---》commons-io 2.2 插件