pom.xml中依赖的定义样例:
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
但是,实际使用中,会发现pom.xml中很多依赖是没有指定的,如:
org.springframework.boot
spring-boot-starter-data-jdbc
org.springframework.boot
spring-boot-starter-web
为什么呢?这就涉及到Maven中依赖的版本管理。
实际项目开发中,一个项目包含很多模块,不同模块有不同的依赖,也有多个模块存在共同的依赖。如:
希望一个项目中,不同模块使用的同一依赖采用相同的版本。可以:
(1)方式一:在每个模块的pom.xml文件中指定依赖版本,人为确保不同模块的pom.xml中相同依赖版本号一致。这样会导致维护复杂,后续如果变更依赖版本,需要每个模块排查修改。
(2)方式二:把所有的模块的依赖,都在根目录的pom.xml定义,然后被所有子模块引用。这样会导致子模块引用冗余,对于子模块不需要的依赖,也会被引用过来。
(3)方式三:maven提供了更好的方式,即maven依赖的版本管理:
整个项目,在根pom.xml中通过标签定义依赖的版本:
org.eclipse.persistence
org.eclipse.persistence.jpa
1.3
javax
javaee-api
2.1.1
根目录的pom.xml作为每个模块pom.xml的父pom(通过在pom.xml文件中用指定),在模块的pom.xml仅指定依赖,不指定版本即可:
org.eclipse.persistence
org.eclipse.persistence.jpa
javax
javaee-api
实际上,maven在解析子模块的pom.xml文件中依赖时,采用的就是父pom中标签定义的版本。
和的区别:
(1)用于定义依赖版本,并不是真实的依赖,所以maven在解析pom.xml文件时并不会把内的内容作为真实依赖来做查找更新动作。
(2)是真实的依赖,maven在解析pom.xml时,需要进行查找更新。
通过IDEA等创建的项目,项目根pom.xml中也存在没有版本号的依赖,其版本号如何确定呢?
原因是:Maven为所有项目提供了公共的父pom,在项目的根pom.xml文件中通过引用。项目根pom.xml中也存在没有版本号的依赖,集成的是Maven父pom中通过依赖版本管理定义的版本。