项目概况:父工程myblog下有三个模块,admin,blog和framework。其中framework是公共模块,admin,blog两个模块都引入了公共模块。
问题发现:由于服务器配置较低,无法安装mysql8.0版本,所以只能选择使用5.7。所以就在framework中指定数据库驱动版本号(默认为8.0.15)
<!--mysql数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency>
但是启动项目后,发现报错。经过排查错误,发现admin,blog两个子模块中的依赖版本依然是8.0.15。
查阅资料发现是maven依赖原则导致。
maven依赖的三大优先原则
1.依赖最短路径优先原则 一个项目Demo依赖了两个jar包,其中A-B-C-X(1.0) , A-D-X(2.0)。由于X(2.0)路径最短,所以项目使用的是X(2.0)。
2.pom文件中申明顺序优先 如果A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,maven会根据pom文件声明的顺序加载,如果先声明了B,后声明了C,那就最后的依赖就会是X(1.0)。
3.覆盖优先原则 子pom内声明的优先于父pom中的依赖
问题原因:由于其他三个模块都是直接依赖于父工程的,引入了framework模块之后路径变长。父工程是一个springboot工程,默认mysql版本为8.0.15,由于没有显式设置mysql驱动版本,所以使用了默认版本。根据最短路径原则,admin和blog模块会选择直接依赖父工程中的版本。
解决方案:在父工程中约束子模块中依赖版本号
<dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> </dependencies> </dependencyManagement>
dependencyManagement可以统一管理项目中依赖包的版本号,不会实际引入jar。当需要变更版本号时只需在父pom中修改即可;如果某个子项目需要指定一个特殊的版本号时,只需要在自己项目的pom.xml中显示声明一个版本号即可,此时子项目会使用自己声明的版本号,而不继承父项目的版本号。