1.maven的依赖原则
1.路径优先,(引用层级越少越好)
2.声明优先 ,(相同路径长度下,先声明的先生效)
3.覆写优先,(引用方和被引用方声明相同的jar,版本以引用方的版本为依据)
2.maven的依赖范围
<dependency>
<groupId>X</groupId>
<artifactId>X</artifactId>
<version>X</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>X</groupId>
<artifactId>X</artifactId>
<version>X</version>
<scope>test</scope>
</dependency>
2.1 complie 编译范围的依赖、
2.2 test 测试范围的依赖 ( 只对test有效,不参与打包参与部署)
2.3 provided 开发范围的依赖(典型例子servlet-api 在开发过程中必须提供(添加tomcat运行时环境/添加maven依赖),打包过程中忽略,运行时有servlet容器提供)
3.依赖传递
A依赖B ,B依赖C , 最后A也会有C的jia包;
4.依赖冲突
4.1 idea plugins 安装 Maven Helper 插件,在项目的pom文件左下角中会 Dependency Analyzer 按钮,点击能进入maven的依赖树界面,查看jar的依赖结构。点击到具体的jar,可以看到整个项目中直接引用和间接引用该jia的初始包,冲突版本等信息;
4.2 mvn dependency:tree 指令调出maven依赖树,查看依赖包 (我在程序一直在下载依赖包,测试成功),
执行结果:
4.3 idea自带的maven树支持,树的结构太复杂,不太能看明白。
5.依赖排除
5.1 pom配置直接排除 <exclusions>标签
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
5.2 不同模块引用的版本不同,通过测试调到一致版本,(建议统一用高版本)
5.3 通过maven的依赖原则来调整坐标在pom文件的申明顺序是最好的办法。
相同pom中调整声明的先后顺序
不同模块在同一个父类模块中时,调整父类Pom中 <modules>标签的声明顺序
5.4使用 dependencyManagement
如果有父 pom.xml 存在的话可以使用 dependencyManagement 来解决这个问题。
父 pom.xml 的关键部分如下
<properties>
<org.springframework.version>4.3.18.RELEASE<org.springframework.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}<version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependencies>
</dependencyManagement>
而子 pom.xml 中的关键部分如下
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependencies>
子 pom.xml 依赖中版本号会直接继承父 pom.xml 中 dependencyManagement 中依赖的版本号。