如果在pom文件的依赖或者插件中没有指定版本号,maven会拉取一个默认版本,这个版本从哪里获得到的?

答案是parent,parent里没有那就去parent的parent里找,总之在它的祖先里找。

在springboot项目中,一般会有个顶级父亲,会为开发者提供常用jar的版本管理,所以不指定版本,就会使用人家提供好的。当然,指定也是可以的,这会覆盖官方默认的版本。父亲不一定是一个封闭的超级项目,也可能只是一组合适的定义。

在一次Springboot项目编译过程中,插件版本报错,项目pom文件里没有指定插件版本,这个版本是从哪里来的呢?经过一番查找,终于找到了声明版本的pom.xml文件。

spring boot 项目中的plugin版本是在框架中连续依赖定义的

从该项目的parent的parent开始:

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.2.RELEASE</version>
		<relativePath/> 
</parent>

按照下面的顺序连续往上找:

 spring-boot-starter-parent——>spring-boot-dependencies

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-dependencies</artifactId>
		<version>2.2.2.RELEASE</version>
		<relativePath> ../../spring-boot-dependencies</relativePath>
</parent>

进入spring-boot-dependencies的pom文件里,便能看到指定的插件版本了,和idea中显示的插件版本一致。

spring boot maven setting 配置 spring boot maven plugin_maven

如果项目的一个依赖项还依赖于其他jar,该jar指定了一个版本,则该版本被采用。 Maven 有一种名为传递依赖关系的机制。如果没有显式指定依赖项的版本,它将搜索依赖关系树并使用树中的最近定义。如果有两个最近的定义,则第一个声明的获胜。

官方文档解释https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-build-systems

“正常项目,最好都写上,不写具体版本号时,如果项目复杂度较低,依赖的开源项目少,那就还好。如果项目复杂度高,依赖了很多的大的开源项目,那这些项目里自身又依赖了其它jar时,内部依赖jar极有可能出现版本冲突问题。在版本冲突出现时,早期不写具体版本号的写法,就会发现坑到死。

jar冲突,综合到具体版本上,才能针对性的引入某个老版本,哪个新版本绕过去,甚至选择屏蔽哪个,都是要经过多次试验和研究的。动态无版本号写法,研究个p,过两天构建出的依赖jar也许版本又变了。在ide工具或者eclipse中体现不出这个问题,引入集成构建,这种问题就都出来了。各种“unknow-version”,各种“jar is missing”