maven中dependencyManagement的使用无非就是统一控制依赖的版本,但是在一些情况下modules自身指定的版本是无效的
例如:
//parent pom.xml
<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>love.llnn</groupId>
<artifactId>mavendep</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>web</module>
<module>service</module>
</modules>
<packaging>pom</packaging>
<name>mavendep</name>
<dependencyManagement>
<!-- 片段1 start -->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<!-- 片段1 end-->
</dependencyManagement>
</project>
//web pom.xml
<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">
<parent>
<artifactId>mavendep</artifactId>
<groupId>love.llnn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<packaging>war</packaging>
<name>web</name>
<dependencies>
<dependency>
<groupId>love.llnn</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
//service pom.xml
<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">
<parent>
<artifactId>mavendep</artifactId>
<groupId>love.llnn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service</artifactId>
<packaging>jar</packaging>
<name>service</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
</project>
如下是结构图
如果存在“片段1”,web打包之后mybatis版本是3.1.0
执行
mvn dependency:tree
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ web ---
[INFO] love.llnn:web:war:1.0-SNAPSHOT
[INFO] \- love.llnn:service:jar:1.0-SNAPSHOT:compile
[INFO] \- org.mybatis:mybatis:jar:3.1.0:compile (version managed from 3.4.0)
原因是:mybais对于web项目是间接依赖,间接依赖时dependencyManagement优先级更高!!!!!
解决方法是:所有的版本依赖都在parent项目中控制
如果根pom还有parent时,间接依赖时dependencyManagement的优先级别高!!!!,此时的解决方法修改parent的parent pomxml,或者在parent中把它的parent重写掉