在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中显示的插件版本一致。
如果项目的一个依赖项还依赖于其他jar,该jar指定了一个版本,则该版本被采用。 Maven 有一种名为传递依赖关系的机制。如果没有显式指定依赖项的版本,它将搜索依赖关系树并使用树中的最近定义。如果有两个最近的定义,则第一个声明的获胜。
官方文档解释
“正常项目,最好都写上,不写具体版本号时,如果项目复杂度较低,依赖的开源项目少,那就还好。如果项目复杂度高,依赖了很多的大的开源项目,那这些项目里自身又依赖了其它jar时,内部依赖jar极有可能出现版本冲突问题。在版本冲突出现时,早期不写具体版本号的写法,就会发现坑到死。
jar冲突,综合到具体版本上,才能针对性的引入某个老版本,哪个新版本绕过去,甚至选择屏蔽哪个,都是要经过多次试验和研究的。动态无版本号写法,研究个p,过两天构建出的依赖jar也许版本又变了。在ide工具或者eclipse中体现不出这个问题,引入集成构建,这种问题就都出来了。各种“unknow-version”,各种“jar is missing”