目录
一、分模块设计与开发
二、继承与聚合
继承
步骤
版本锁定
聚合
操作方法
三、bug汇总解决
1、未找到parent.relativePath
2、Unable to find main class
3、java: 模块循环不支持注解处理。请确保将循环 [common,pojo] 中的所有模块排除在注解处理之外
为什么要分模块开发?
假设我们现在要开发一个大型的电商平台,其中会有很多个模块功能要实现
假如我们现在把这些模块的代码全部放到一个java项目中,而且为了效率和速度需要有多个人同时开发,它们同时操作这一个项目,那么管理和维护都会变得相当困难,自己写的代码也会难以复用。
为此,我们将项目按照功能拆分成若干个模块,方便项目的维护、拓展,也方便模块间相互调用,资源共享
比如我们可以将一个项目分为三个模块
那么此时management模块中就没有pojo与utils了。如果要使用到这连两个模块中的类,那么就可以通过导入依赖坐标的方式引入
注意:分模块开发需要先针对模块功能进行设计,再进行编码,不会先将工程开发完毕,然后再进行拆分的
接下来我们会来一步步创建一个多模块工程
概念:描述的是两个工程之间的关系,与Java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
作用:简化依赖配置,统一依赖管理
实现:
1、创建一个父模块,设置打包方式为pom(默认是jar)
打包方式 | 说明 |
jar | 普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行) |
war | 普通web程序打包,需要部署在外部的tomcat服务器中运行 |
pom | 父工程或聚合工程,该模块不写代码,仅进行依赖管理 |
首先我们还是像之前单模块一样,使用Spring Initializr创建一个父模块
这个模块是为了统一管理依赖版本,聚合子模块的,因此在创建的时候不需要在这里添加任何依赖
同时它也不需要.mvn、src、Help.md、mvnw.cmd、mvnw文件,统统删掉即可
配置父模块pom.xml文件,修改打包方式为pom。底下那个是父模块默认的自己的信息,可以对其进行更改,
pom
com.wal
Sticker
0.0.1-SNAPSHOT
Sticker
2、在子工程的pom.xml文件中,配置继承关系
接着再来创建需要的子模块,在父模块上右键创建新的模块
同样使用Spring Initializr创建 server 模块
这个模块是用来启动后端服务的,存放Controller、Service、Mapper的,因此只需要这个模块中保留启动类即可。也要引入web依赖
接下来我们要去子模块中,在parent中改成父模块的信息。所有的子模块都需要这一步
3、在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)
原本这里还有两个起步依赖,但是父模块并不需要,所以给删了。
测试启动一下
成功运行
父模块中引入的依赖会继承到子模块中,但如果子模块中已经自己引入了一个不同版本的该依赖,那么就会优先生效子模块中的依赖。
这样的话就会出现一个问题,假如三个子模块中都要使用同一个依赖,但是版本各不相同,那么就会导致程序无法正常运行
因此需要在父模块中使用
此时子工程引入依赖时就无需指定
注:
如果你觉得这样配置太繁琐,那么还有另一种方式,创建
小细节: 在需要使用到web服务的模块中只需要引入web起步依赖即可,不需要指定版本号,父模块也一样。这是因为,父模块还有也有一个parent
我们在创建springboot工程的时候早就选择过了要使用的springboot版本,这些信息就存储在了父模块的parent中
所谓聚合,就是将多个模块组织成一个整体,同时进行项目的构建,一键操作
为什么要一键操作,这是因为我们在为项目进行打包的时候,其中的模块错综复杂,相互依赖。
比如这个例子中,一个模块引入了另一个模块,那么就要依次为子模块和父模块执行install,然后才能package,非常麻烦。
因此,我们需要一个专门负责聚合的模块,聚合工程。它必须是不具备任何业务能力的空工程,其中只能有一个pom文件。
欸,巧了,父模块不就正好符合这个条件吗?因此父工程也担任了聚合工程的作用。
在父工程(聚合工程)的pom文件中,添加
server
pojo
common
执行父模块的install命令
注意:这里有一个易错点,如果某个子模块的构建依赖于其他模块的安装,而这些模块还未安装,就可能导致构建失败。 出现报错
Non-resolvable parent POM for com.wal:server:0.0.1-SNAPSHOT: Could not find artifact com.wal:Sticker:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at no local POM @ line 6, column 13 -> [Help 2]
先把这段
然后再注释回来,install。这样就可以正常运行了。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题
比如:企业中有A、B两个开发组,A开发了一个工具jar包,B想要使用,那么就要引入依赖。 A是没有权限将jar包上传至中央仓库的,中央仓库全世界只有一个,但又要让B下载到,因此需要上传至私服中。
我们引入一个依赖,那么此时就会先去本地仓库查找,如果本地仓库中没有,就会去私服中查找依赖。若是私服中也没有该依赖,才会去中央仓库中寻找。
注:私服在企业开发中,一个项目/公司,只需要一台即可(无需我们搭建,会使用就行了)
私服中有三个仓库
比如:查看我们之前创建的模块信息,版本号默认是snapshot,这代表正在开发中
1、设置私服的访问用户名/密码(maven的setting.xml中servers中配置)
2、IDEA的maven工程的pom.xml文件中配置上传(发布)的地址
3、设置私服依赖下载的仓库组地址(maven中settings.xml中的mirrors、profiles中配置)
如果配置过阿里云的仓库,需要将其直接替换掉,因为那也是一个私服
作为一个初学者,在这里遇到了非常多的bug,在这里集中汇总讲解一下
Non-resolvable parent POM for com.wal:server:0.0.1-SNAPSHOT: Could not find artifact com.wal:Sticker:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at no local POM @ line 6, column 13 -> [Help 2]
原因:我们为了统一聚合打包使用了
如果某个子模块的构建依赖于其他模块的安装,而这些模块还未安装,就可能导致构建失败。 出现报错
首先一定要确定这地方与父模块的信息是相同的,名字是区分大小写的,不要写错,这样才能找到
./是本目录,../是上级目录
解决方法:
此时有两种处理方式
1、先把这段配置代码注释掉,执行install。
然后再注释回来,install。这样就可以正常运行了。
2、或者直接使用mvn命令
mvn install -am
这个命令告诉 Maven 在构建时同时构建必要的模块。这样,Maven 会先构建并安装所有的依赖模块,然后再构建并安装当前模块。这通常可以解决类似的依赖问题。如果问题仍然存在,可能需要检查子模块之间的依赖关系,确保它们之间的依赖关系正确配置。或者还是直接用上一种方法吧。
原因:你在别的模块中使用了
那么就必须要一个main方法作为入口,但是这个子模块是管理资源或者工具的,要勾八入口啊,所以最好的解决方法还是直接将这段配置删掉。
此时再install一下
原因:你的依赖传递设计的有问题,大概是你一个模块A引入了另一个模块B之后,这个模块B又引入了模块A。这样就导致了循环,
也有可能是你在父模块中直接全部引入了所有模块依赖
解决方法:重新设计你的依赖引入去,别导致循环就OK了
4、我只遇到了这几个bug,还遇到什么bug可以在评论区留言