• Maven


    避免依赖冲突的原则

    如果项目中的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 插件

  • 相关阅读:
    [转载]WSUS客户端排错--使用wsus client tools
    [转载]vSphere ESXi主机配置iSCSI存储
    RHEL6.5下oracle11G的监听启动停止
    配置EM遇到的问题:*_orcl not foundlistener not upError creating the repository
    chrome有道翻译--书签栏关闭开启快捷键
    linux下sqlplus实现浏览历史命令和删除错误字母功能
    windows下plsql安装并配置oracle client
    chrome google浏览器添加AdBlock插件
    Python基础之异常处理
    Python基础之finally异常处理
  • 原文地址:https://www.cnblogs.com/anliven/p/7979769.html
Copyright © 2020-2023  润新知