首先我们先创建一个maven项目:
创建完成之后就是我们日常所见的web项目:
接着我们根据这个刚刚创建的项目作为父项目然后创建一个子项目(Module):
下面是创建完成之后的目录:
父类pom文件的变化:
子项目pom文件的变化:
上图中子项目自动生成了一个<parent>标签:所以问题来了,这个parent标签有什么作用呢?
首先我们先在父项目中添加一个依赖:这里选择的是springboot的启动依赖,如图依赖正常导入
然后我们转眼一看子项目的依赖:发现居然也有这个依赖
总结:parent标签是继承父类的意思,父类有什么东西子类会继承。
但是我们在日常项目中也会遇到这样的写法:就是父模块也有<parent>这个标签,那我这个父模块已经没有父类了啊,我继承什么东西呢?下图所示:
首先我们要知道两个概念:groupId: 用于标识项目所属的组织或者项目组
artifactId: 用于标识项目的实际名称,即产物的名称
我们既然已经明白了<parent>标签的作用我们就不难发现,我们子项目中parent标签的groupId和artifactId恰恰就是我们父项目对应的groupId和artifactId
虽然我们的父项目没有继承父项目了,但是我们可以继承别人写好的模块啊,就比如我举的这个例子: org.springframework.boot,这是人家早就写好的,我们可以用的
然后根据我们前面的思想,子类继承了父类就可以使用父类中的依赖,但是我们仔细查看,其实父项目继承的这个依赖其实是一个规定版本的依赖:意思就是只要groupId是org.springframework.boot的依赖的话,那就不需要重新规定版本了,意思就是以后版本可以不用写了:如图所示:
子项目springboot启动成功:
实际开发中,父项目主要是用来规定版本并不会写一些代码主要使用,就是一层壳子,用来管理我们多个子项目的,但是如果我需要使用<parent>标签的话,那我岂不是父项目有多少依赖,子项目就自动引入多少依赖,这不是我们想要的结果,我们想要的就是父项目的pom文件中有我们项目中所有的依赖,但是子项目需要什么就拿什么,这里我们就需要了解一<dependencyManagement>标签了。
<dependencyManagement>作用:
-
统一版本: 可以确保项目中所有模块使用相同的依赖版本,避免版本冲突。
-
简化配置: 子模块中不需要指定每个依赖的版本,减少了 POM 文件的冗余。
-
易于维护: 依赖版本的管理集中在一个地方,便于维护和更新。
请注意,<dependencyManagement>
只是对依赖版本的管理,并不会引入实际的依赖。子模块仍然需要在 <dependencies>
部分中显式声明需要的依赖。这个机制让你在父项目中定义依赖版本的"规范",而在子项目中应用这些规范。
下图不难看出,我加入了这个标签之后,发现父项目中一个依赖都没有,当然子项目也不可能有,因为这只是一个版本,父项目中没有是我们需要的,但是子项目我们需要,所以我们子项目想要什么依赖就在父项目中找然后引入就可以了(可以不加版本,因为父项目中已经声明了版本)。
子项目添加依赖之后的效果图:我们惊奇的发现,为什么跟我想象的不一样呢,这里子项目还是没有依赖。
原因:我们以为我们在父项目中也引入<parent>标签之后,他就会自动帮我们把版本号同步到<dependencyManagement>标签当中的依赖中去,其实并不会,我们要想使用<dependencyManagement>标签就要老老实实在依赖中定义版本,之前的<parent>标签遇到<dependencyManagement>并不会达到我们之前想要的结果。<parent>标签的定义版本貌似只对依赖有效果,但是<dependencyManagement>中并不是依赖,只是版本,所以无效。
我们最后要知道这两个标签有什么不同:
-
<parent>
元素: 通过<parent>
元素,子项目可以继承父项目的一些配置信息,例如插件配置、编译选项等。但是,它并不会自动应用于所有依赖项。父项目中的版本号主要用于 Maven 构建插件、Maven Compiler 插件等插件的默认配置,并不会直接影响依赖版本。 -
<dependencyManagement>
元素: 这个元素用于集中管理项目中所有模块的依赖版本。在<dependencyManagement>
中声明的版本信息,对子项目是一种"提供者"的角色,而子项目需要显式地引入这些依赖,成为"消费者"。声明版本号的目的是为了确保子项目使用的依赖版本与父项目一致。
父项目中加上版本之后一切就都正常了,然后我们把父项目中的<parent>标签删了,因为我目前用不到。下图所示:
运行也正常:
总结:我理解的层级关系就是父模块什么都不干只是声明版本和管理各个子项目,子项目就是父项目的moudel。