Spring 为什么我的项目中的库版本与它不同';父母的pom声明?
我简化了我的项目结构并找到了一些线索。我的项目结构如下所示:Spring 为什么我的项目中的库版本与它不同';父母的pom声明?,spring,maven,spring-boot,Spring,Maven,Spring Boot,我简化了我的项目结构并找到了一些线索。我的项目结构如下所示: -------- project 1 --------- parent |_ project-a |_ src |_ pom.xml |_ pom.xml ------- project 2 ---------- project-b |_ src |_ pom.xml --------------------------- 在项目1中,父对象是project
-------- project 1 ---------
parent
|_ project-a
|_ src
|_ pom.xml
|_ pom.xml
------- project 2 ----------
project-b
|_ src
|_ pom.xml
---------------------------
在项目1中,父对象是project-a的maven父对象,它的pom.xml如下所示:
4.0.0
org.springframework.boot
spring启动程序父级
2.1.6.1发布
com.demo
父母亲
聚甲醛
1.0-快照
使用myfaces的自定义项目
http://www.myorganization.org
项目a
在父级的pom中,它将spring boot声明为maven父级,将project-a声明为模块。在项目a中,其pom如下所示:
[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ project-b ---
[INFO] com.demo:project-b:jar:1.0-SNAPSHOT
[INFO] \- com.demo:project-a:jar:1.0-SNAPSHOT:compile
[INFO] \- mysql:mysql-connector-java:jar:8.0.16:runtime
父母亲
com.demo
1.0-快照
4.0.0
项目a
罐子
project-a Maven Webapp
UTF-8
1.7
1.7
mysql
mysql连接器java
8.0.11
运行时
org.apache.maven.plugins
maven编译器插件
3.8.0
1.8
1.8
1.8
1.8
org.apache.maven.plugins
maven源插件
3.0.1
附加来源
罐子
project-b是一个独立的项目,其pom如下所示:
-------- project 1 ---------
parent
|_ project-a
|_ src
|_ pom.xml
|_ pom.xml
------- project 2 ----------
project-b
|_ src
|_ pom.xml
---------------------------
4.0.0
父母亲
com.demo
1.0-快照
com.demo
b项目
罐子
1.0-快照
使用myfaces的自定义项目
http://www.myorganization.org
com.demo
项目a
1.0-快照
${project.artifactId}
org.springframework.boot
springbootmaven插件
真的
执行官
真的
通过mvn install安装project 1后,project-b的依赖关系树如下:
[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ project-b ---
[INFO] com.demo:project-b:jar:1.0-SNAPSHOT
[INFO] \- com.demo:project-a:jar:1.0-SNAPSHOT:compile
[INFO] \- mysql:mysql-connector-java:jar:8.0.16:runtime
但是如果我删除project-b的pom中的父声明,project-b的依赖关系树就是我所期望的:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ project-b ---
[INFO] com.demo:project-b:jar:1.0-SNAPSHOT
[INFO] \- com.demo:project-a:jar:1.0-SNAPSHOT:compile
[INFO] \- mysql:mysql-connector-java:jar:8.0.11:runtime
在重新安装Project1之后,我还尝试在Project1的pom中删除SpringBoot的父依赖项,结果也是我所期望的。所以我想父声明是关键,但是为什么呢
致以最诚挚的问候。这是因为家长的依赖关系比project-a的依赖关系优先级更高。
您可以参考此文档。
依赖项中介-这决定了当遇到多个版本作为依赖项时,将选择工件的哪个版本。Maven选择了“最接近的定义”。也就是说,它使用依赖关系树中与项目最接近的依赖关系的版本。您总是可以通过在项目的POM中显式声明来保证版本。请注意,如果两个依赖项版本在依赖项树中的深度相同,则第一个声明获胜 “最近的定义”意味着所使用的版本将是依赖关系树中最接近您的项目的版本。例如,如果A、B和C的依赖项定义为A->B->C->D2.0和A->E->D1.0,则在构建A时将使用D1.0,因为从A到D到E的路径较短。您可以在中显式地向D2.0添加依赖项,以强制使用D2.0
project-b
父母亲
|----mysql connector java(8.0.16)这就是sql连接器com.love4bb:db:jar:0.0.2
的作用,但您没有透露这是什么。首先,如果项目A是父POM,它需要有POM
。8.0.16版本是com.love4bb:db的依赖项,您需要添加排除项才能在project中使用声明的版本-a@ThomasAndolf这是我的错,我从com.love4bb重命名了项目-A包名称,我更新了项目-B的依赖关系树。@JFMeier我编辑了我的问题,并更清楚地描述了我的问题,谢谢!我认为您是对的,父声明将使project-b扩展其父依赖项。因此,在依赖关系树中,mysql连接器java(8.0.16)路径比mysql连接器java(8.0.11)路径短。project-b的依赖树显示误导了我,因为它显示mysql连接器java(8.0.16)来自project-a,而不是project-b的父级。非常感谢。