Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 为什么我的项目中的库版本与它不同';父母的pom声明?_Spring_Maven_Spring Boot - Fatal编程技术网

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的父级。非常感谢。