精华内容
下载资源
问答
  • maven 依赖传递

    2015-12-19 17:27:03
    maven依赖传递背景 假设A–>C B–>A ==> B–>C ,A依赖于C是直接依赖,B依赖于A是直接依赖,B依赖于C是传递依赖。 现象一:A–>log1.0 B–>log2.0 C–>A,B 那么我们来看依赖关系:User-core依赖于log4j 1.2.17...

    maven依赖传递

    背景
    假设A–>C B–>A ==> B–>C ,A依赖于C是直接依赖,B依赖于A是直接依赖,B依赖于C是传递依赖。
    现象一:A–>log1.0 B–>log2.0 C–>A,B 那么我们来看依赖关系:

    User-core依赖于log4j 1.2.17

    [java] view plaincopyprint?

                <dependency>  
                    <groupId>log4j</groupId>  
                    <artifactId>log4j</artifactId>  
                    <version>1.2.17</version>  
                </dependency>  

    User-log包依赖于log4j 1.2.9

    User-service依赖于user-core,也依赖于user-log

    [java] view plaincopyprint?

                <dependency>  
                    <groupId>log4j</groupId>  
                    <artifactId>log4j</artifactId>  
                    <version>1.2.9</version>  
                </dependency>  
    

    这里写图片描述

    可以看出user-service依赖的log4j的版本号为1.2.9。因为先依赖的log,后依赖于core,user-service依赖log4j相当于间接依赖。因此当有间接依赖的时候先依赖的哪个,就会依赖哪个包的间接依赖。

    总结:间接依赖,如果级别相同,依赖于先引用的依赖。

    现象二
    先依赖于user-core,再依赖于user-log.下面看commons-logging.jar的版本号:
    这里写图片描述

    User-core里面的Commons-logging的版本号为1.0.4
    User-log里面的Commons-logging的版本号为1.1.1
    User-service里面Commons-logging的版本号为1.1.1

    按照第一种,user-service里面的jar版本应该为1.0.4,现在为什么是1.1.1呢?
    我们来解析:
    这里写图片描述

    User-core里面依赖于dbunit,而commons-logging.jar是作为依赖项被引用下来的
    User-log里面是直接引用commons-logging.jar
    因此它们处于不同的依赖树上,深度越浅越被优先选择。

    小结
    1.在工程的依赖树上,深度越浅,越被有限选择。
    2.若两个依赖包处于依赖树上的同一层,则谁在前选择谁。

    总之,避免传递依赖时引起版本问题出现的最佳实践。一般情况下,如果工程直接依赖到某一框架的多个模块,最好全部声明这些依赖。

    展开全文
  • maven依赖传递

    2019-12-13 10:20:50
    依赖管理是maven提供的主要功能之一。无论我们需要什么依赖,我们只需将它们添加到POM.xml中。由于maven,所有必要的类和资源都会自动添加到项目的classpath中。 在添加依赖项时,我们可以使用optional标志,或将...

    optional和provided

    依赖管理是maven提供的主要功能之一。无论我们需要什么依赖,我们只需将它们添加到POM.xml中。由于maven,所有必要的类和资源都会自动添加到项目的classpath中。

    在添加依赖项时,我们可以使用optional标志,或将scope设置为“provided”。在这两种情况下,依赖关系都将在声明它们的模块的classpath中,但是使用将它们定义为依赖关系的模块不会在其他项目中传递它们,即不会形成依赖传递。

    从语义来上理解

    optional
    可选的,可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。

    scope provided
    提供的,可以理解为此包不由我直接提供,需要调用者/容器提供。

    举个例子说明二者的使用场景和区别

    optional
    现开发了一个类似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多种数据库方言的支持:mysql/oracle/db2/postgresql…
    每种数据库支持也独立了一个module,Summer的依赖中配置了每种数据库的支持包:summer-mysql-support/summer-oracle-support…

    但是实际引用此框架/依赖时,并不需要所有数据库方言的支持。此时可以把数据库的支持包都配置为可选的true。
    引用此框架时,只需按需引入自己需要的方言支持包即可,避免了冗余繁杂的依赖,也降低了jar包冲突的风险。

    scope provided
    现有一普通Web工程,必然会用到servlet-api这个包。但是实际上这个包一定是由容器提供的,因为我们这个web会部署到容器内,容器会提供servlet-api,如果此时项目中再引用的话就会造成重复引用,会有版本不一致的风险。

    总结

    二者从功能来看,都做到了依赖不传递。但在语义上表示不同,使用时按场景选择就好。

    展开全文
  • Maven依赖传递

    2018-12-10 14:10:00
    依赖传递原则:  1、路径最短原则  2、路径相同是先申明者优先(dependency申明顺序先的优先) 转载于:https://www.cnblogs.com/sandyyeh/p/10096171.html

    依赖传递原则:

      1、路径最短原则

      2、路径相同是先申明者优先(dependency申明顺序先的优先)

     

    转载于:https://www.cnblogs.com/sandyyeh/p/10096171.html

    展开全文
  • 一、Maven依赖传递 假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A,那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是...

    转自:http://www.cnblogs.com/ygj0930/p/6628429.html

    一、Maven依赖传递

    假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A,那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性

    二、依赖传递的排除

    如上,C—>B—>A。加入现在不想执行C时把A下载进来,那么我们可以用<exclusions>标签

    <dependencies>
    
        <dependency>
            <groupId>B</groupId>
            <artifactId>B</artifactId>
            <version>0.0.1</version>
    
             <exclusions>
                <exclusion>
                  <!--被排除的依赖包坐标-->
                  <groupId>A</groupId>
                  <artifactId>A</artifactId>
                  <version>0.0.1</version>
                </exclusion>
             </exclusions>
        </dependency>
    </dependencies>
    

    三、依赖冲突与解决

    依赖冲突:一个项目A,通过不同依赖传递路径依赖于X,若在不同路径下传递过来的X版本不同,那么A应该导入哪个版本的X包呢?

    冲突解决方案:

    1、如果依赖路径的长度不同,则“短路优先”:

    A—>B—>C—>D—>E—>X(version 0.0.1)

    A—>F—>X(version 0.0.2)

    则A依赖于X(version 0.0.2)

    2、依赖路径长度相同情况下,则“先声明优先”:

    A—>E—>X(version 0.0.1)

    A—>F—>X(version 0.0.2)

    则在项目A的<depencies></depencies>中,E、F那个在先则A依赖哪条路径的X

    展开全文
  • 一、Maven依赖传递 假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—&gt;B—&gt;A。 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中...
  • 一个工程下,只会依赖某个jar包的一个版本,包括依赖传递过来的jar包(也会转化成其中的某一个版本)。 解决模块工程之间的jar包冲突问题,maven根据自己的内置原则自动处理冲突。 加载哪个版本jar包的原则 路径最短...
  • 5.Maven依赖传递

    千次阅读 2019-05-17 17:10:30
    maven依赖传递 依赖传递:分为①jar包依赖传递 ②scope范围依赖传递 上图解析:上图是一种相对比较好的工程架构图。即:一个工程包括report-data,report-dao,report-charts,report0-web,common-lib五个...
  • maven依赖传递关系

    2017-04-14 09:36:42
    一、maven 依赖传递规则 举个例子,比如A依赖B,B依赖C,那么A也是依赖C的。A是对B的直接依赖,A对C是传递依赖 ①、最短路劲原则 如,路劲一:A依赖B,B依赖C,C依赖D(1.0.0);  路劲二:A依赖E,E依赖D...
  • 这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 ...maven依赖传递和版本冲突的解决_腾讯视频 PPT戳这里 一、背...
  • 1 maven依赖传递 本地项目路径:F:\xiangmu3\Xin\FuQiang\maven\code 2 maven排除依赖 3 注意事项 4 零散知识点 1 maven依赖传递 <!-- 南哥项目--> <!-- 山鸡依赖于南哥,南哥依赖于逼...
  • 解决maven依赖传递中的版本冲突问题
  • 什么是Maven依赖传递? <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.5.RELEASE<...
  • 依赖传递 maven中的项目依赖默认是可传递的,所以会添加很多不必要的依赖 比如A->B、B->C、那么A自动依赖C。 Maven 依赖排除(Exclusions) maven构建的项目具有依赖可传递的特性,添加某个依赖的时候,可能会...
  • 五、Maven依赖传递1依赖传递测试 首先创建mavenA/mavenB/mavenC三个项目, 验证的是B-&gt;A C-&gt;B , C不直接依赖A,那么c中有A 、BA-&gt;B,首先的对A项目进行 maven install ,编译打包上传到...
  • 依赖范围依赖范围编译测试运行举例compileYYYspring-coretest-Y-junitprovidedYY-servlet-apiruntime-YYJDBC驱动systemYY-本地maven仓库的类库由上表我们可以总结jar包大致分为四大类:1、编译、运行与打包时都需要...
  • 依赖范围对传递依赖的影响 A<-----B A对B有依赖 (第一直接依赖) B<-----C B对C有依赖 (第二直接依赖) A<-----C A对C有间接依赖 (间接依赖) 其中列时第一直接依赖,行时第二直接依赖 ![在这里插入图片...
  • 2 依赖传递 3 依赖冲突的解决 4 依赖排除 6 继承和聚合 7 maven私服 8 把第三方jar包放入本地仓库或私服 9 常用命令 10手打不容易,感觉好就赞一毛钱地 Maven使用 1 网上依赖jar网址 ...
  • maven依赖性具有传递性:A.jar -> B.jar -> C.jar (当且仅当B.jar -> C.jar 的范围是compile(<scope>compile</scope>)) 程序示例: if(A.jar 依赖 B.jar){ if(B.jar 依赖 C.jar &&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,801
精华内容 720
关键字:

maven依赖传递