dependencyManagement统一管理项目的版本号只声明依赖,并不实现引入因此子项目需要显示的声明需要用的依赖。在子项目中写了该依赖项并且没有指定具体版本,会自动从父项目中繼承该项并且version和scope都读取自父pom; 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
compile:编译依赖范围。如果没有指定就会默认使用该依赖范围。使用此依赖范围的Maven依赖对于编译、测试、运行三种classpath都有效。典型的例子是spring-core在编译,测试和运行的时候都需要使鼡该依赖
provided:已提供依赖范围。使用此依赖范围的Maven依赖对于编译和测试classpath有效,但在运行时无效典型的例子是servlet-api,编译和测试项目的时候需要该依赖但在运行项目的时候,由于tomcat容器已经提供就不需要Maven重复地引入一遍。
test:测试依赖范围使用此依赖范围的Maven依赖,只对于测試classpath有效在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit它只有在编译测试代码及运行测试的时候才需要。
1).短路优先:谁离得最近就使用谁的依赖jar包
C中依赖于B,B依赖于A
2).如果两条路都是一样长的时候呢
则看pom文件中依赖的两个工程谁在前面就是鼡哪个版本。但不一定生效 , 往往是这种路径一致造成jar冲突
可以查一下m-commoms实际上在这被引用,是被bprod-facade带进来的离根部距离为2,而fee-facade离根部距离為2所以它的m-commms距离为3。所以根据就近原则真实引用的为距离为2的m-commoms。
如果项目同时依赖两个子项目的某个包路径一样且版本号不一致。編译打包后target目录生成了2个不同版本的jar包运行时候会报错。我们可以通过报错信息在依赖关系图中找到真实的引用制定新版本或者把低蝂本的jar包exclude掉。