练习继承时,一个同学今天问我:为什么在父类中写了Junit,子类中还要写呢?
首先明白 dependencies与 dependencyManagement的区别:
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项,如果父类有很多依赖,这样没用的也继承来,会造成臃肿。
dependencyManagement里
只是声明依赖,并不实现引入
,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父类pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
这样就应该明白了。
答案:在
Maven
中
,父 POM 文件通常用于管理子模块的公共
依赖
和版本。一旦在父 POM
中
定义了一个
依赖
,所有的子模块都能够访问到这个
依赖
,而不需要在每个子模块
中
单独
声明
。在父 POM
中
声明
的
依赖
,子模块是可以直接使用的,不需要再次引入。如果需要在子模块
中
覆盖父 POM
中
的版本,可以在子模块的 POM 文件
中
声明
相同的
依赖
和新的版本号。标签
中
声明
了一个
依赖
,那么在所有的子模块
中
,只需要
声明
这个
依赖
的 groupId 和 artifactId,不需要再
写
版本号,因为版本号会自动
继承
自父 POM。
工程的拆分
工程的拆分可以实现分模块开发与测试,可实现多线程开发与管理,提高工程代码复用度的同时也提高软件的开发速度与效率。
一个完整的早期开发好的crm项目,现在要使用
maven
工程对它进行拆分,这时候就可以将dao拆解出来,形成独立的工程,同样service,action也都进行这样的拆分。
把工程拆分成独立的工程,将来要用到的时候就把它们的坐标给引进来就行了,这就有点类似于搭积木一样,其
中
dao,service,web.都是crm06的子模块。
从它的目录结构可以看出,父工程本身不
写
代码,它里面
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.2</version>
项目越来越趋向模块化开发,使用
maven
构建工程,必然涉及到父子pom的关联,父pom文件的父级又会
继承
springboot项目,就这样在开发
中
踩坑不少,简单记录一下。
看问题之前先了解
maven
中
的两个标签<dependencyManagement>和<dependencies>,明白的直接跳过。
maven
标签
1、<dependencyManagement>
这里其实是起到管理
依赖
jar版本号的作用,一般只会在项目的最顶层的pom.xml
中
使用到,所有子mod
<groupId>com.thomas.yang</groupId>
<artifactId>School</artifactId>
<version>1.0-SNAPSHOT</version>
(一)父子工程和聚合工程的区别
1)父子:
父类
工程,打包方式是 pom,目标只有一个,就是管理version版本号。可以利用 dependecemanagement 标签,管理一系列。可以有多个单体项目
继承
自这个
父类
。
2) 聚合:单个项目实在太大了,将其分成 几个小模块:页面web, 前端controller,
中
间service,后端 dao。这几个模块分别作为单个项目进行打包。
3)一般来说,不需要聚合工程,仅需要 父子工程,即可一键打包,统一管理版本号。
4)坑1:
父类
的optional标签.