springboot多模块分层开发、改造(搭建、运⾏、打包)
1.情景展⽰
  在JavaWeb开发过程中,我们通常会基于springmvc分层思想对整个项⽬进⾏分层开发:
  常见的就是分为model(域模型层)、dao(数据库访问层)、service(业务逻辑层)、controller(控制器层)、web(表现层),这样分层之后,各个层之间的职责会⽐较明确,后期维护起来也相对⽐较容易。
  通常我们会将其维护到⼀个模块当中,也就是⼀个项⽬就是⼀个模块,把不同的层⽤包进⾏区分,如下图左侧部分。
  但是,随着项⽬越来越复杂,每个层的规模也逐渐增⼤,在⼀个模块中进⾏开发,会给测试和维护带来不便,对于⼤型项⽬来说,⼀般会将每个层放到⾃⼰的模块中,然后每个层建⽴联系,单独维护。
  对于后期开发维护⼈员来说,右⾯这种分模块的⽅式更直观,看着⽐单模块舒服很多。
  好处不多说,⽤了才知道。
2.分层梳理
  下⾯两张图⽚⽅便⼤家对于即将分开的模块之间的关系有着重要的指导意义。
  按照上⾯的思路,确定好哪些包需要移到哪些模块,下⾯就着⼿迁移啦。
3.分模块搭建/改造
  新建模块
  选中项⽬,右键--》New--》Module
  下⼀步
  给模块起个名字
  关于名字,如果项⽬名称不长的话,建议使⽤“项⽬名称-模块名称”的⽅式,这样更加直观;
  当然了,这是建议,直接取模块名称也是完全没有问题的。
  我们先来了解⼀下,新建模块的结构:
  说⽩了,这就是maven的标准⽬录(因为还没有Java⽂件,所以还没⽣成target⽬录,idea会帮我们完成的)。
  第⼀步:迁移公共类(如果没有就忽略);
  base⽬录,我放的是基本⼯具类等公共需要⽤到的东西
  将这个base⽬录直接拖拽到bill-base模块java⽬录下
  在To package⾥输⼊包名路径,路径构成⼀般为:
  com.公司名称.项⽬名称.原来的包名,这有这样,才能保证不同模块的路径前缀是⼀致的。
  不存在的包名会被创建
  创建成功后,class连同包名都会完成迁移
  如果出现上⾯这种原来的被没有删除的情况,⼿动删除即可。
  我们知道,基本⼯具类⼀般情况下,是需要jar包依赖的,迁移成功后如果报错的话:
  ⿏标悬浮上去,在idea中,点击添加jar包,会⾃动将jar包依赖增加到对应的pom⽂件中。
  注意:
  由于是基础⼯具类,其它模块不⼀定会⽤到这个模块,即使需要⽤到,也不⼀定就需要⽤这⾥⾯的jar包,所以,我们可以把bill-base ⾥的依赖设置成可选依赖,这样,其它模块需要对应jar包时,需要重新引⼊依赖;也不宜引起jar包冲突。
  第⼆步:迁移实体类;
  新建model模块
  同样,关键在于迁移的包名(要把po这个包放到哪⾥)
  第⼆关键点:下图提⽰,是在告诉我们,哪⾥⽤到了po包⾥的Java类
  不要理会,强制迁移。
  迁移成功
  在这⾥,po层就显得有些多余了,重命名,将其删除即可。
  第三步:迁移dao层;
  新建dao模块;
  迁移dao层;
  强制迁移;
  如果出现多余的包名,通过重命名将其删除。
  我们知道,dao层⼜叫持久层,SQL映射也在这层完成,所以,我们只迁移dao层是远远不够的,还可以将对应的l迁移过来。  迁移l⽂件;
  拖拽迁移,并新建⼀个mapper⽂件夹
  容易出错的地⽅:
  错误⽬录长这个样⼦,最终导致在启动项⽬后,对应SQL⽆法执⾏的问题。
  如果出现删除原来⽬录导致新⽣成的⽬录也随之消失的情况,只能还原,只拖动xml完成迁移了。
  更改l的命名空间(与dao层相对照)
  改对了,下⾯就不会再报红了。
  还没结束,还需要完成jar包依赖的迁移;
  ⾸先是模块依赖;
  按照依赖对照关系,dao肯定需要依赖model。所以,在bill-dao的l中添加对model的依赖。
  补充:在⼦模块中,我们可以指定⽗pom⽂件访问路径,这样⽅便我们跳转及识别。
  其次才是jar包依赖。
  将⽗l中的关于mybatis,数据库连接池,mybatis-plus等相关jar包依赖
  重新导包
  最后⼀步:重新编译项⽬。
  注意:这⾥,只重新编译bill-dao模块,因为还没有迁移完毕,重新构建整个项⽬的话,报错信息会出现⼀⼤坨,但我们根本⽆法修改。
  说明:要想只编译bill-dao模块,需要⿏标通过点击选中这个模块,再进⾏Build选项时才会出现编译这个模块的选项。
  你会发现⼀堆bill-dao模块的报错信息,不要怕。
  双击错误信息,会直接跳转到报错的java类。
  改成正确引⽤路径即可。
  挨个把所有bill-dao模块的报错信息改完就⾏了。
  第四步:迁移service层;
  如果我们像往常⼀样进⾏迁移
  这⾥会出现⼀个问题:
  如果不是新建的⽬录(⼀个不存在的⽬录)的话,将会迁移失败。
  必须这样做,才能迁移成功:
  选中java⽬录,右键新建package
  选中service下的所有⼦包。
  强制迁移。
  迁移成功,但vo包没有迁移过去。
  引⼊模块依赖,导包;
  构建bill-service模块
  这⾥分两种情况:
  ⼀种是向上依赖,像原来的dao层和po层已经被我们迁移了出来,改下路径就⾏了;
  另⼀种是向下依赖,service层依赖web层,这种向下串层的⾏为在模块化后是不被允许的,
  像:模块A依赖模块B,模块B⼜依赖于模块A,这种互相依赖是不被允许的,强制引⼊,在最终打包的时候会导致打包失败;只能进⾏单向或单⽅依赖。
  所以,解决办法就是把service层需要的web层的相关包全部迁移到service模块。
  迁移完成
  这⾥需要注意的是:
  按理说,dto是需要放在web模块的,但是,由于service模块需要⽤到,所以,我只将dto⾥部分⽂件进⾏了迁移(最好不要这样搞)。
  迁移jar包依赖;
  ⼤部分的jar包依赖都集中在service模块。
  这⾥需要提醒的是:
  虽然校验和knife4j严格意义上来说,是属于web模块的东西,但是,web和service两个模块其实是不能完全撇清的,剪不断理还乱。
  既然service层要⽤,索性⼲脆把这类jar包全部从web层搬到service层,这样,web模块在引⼊service模块后,也就引⼊了这些jar包依赖。
  对于程序的运⾏,不受丝毫影响。
  完成jar包迁移后,重新导包,重新编译bill-service模块,也许就会报错了。
  如果项⽬中使⽤了Lombok插件,就会报错。
  原因是:我们刚才将Lombokjar包依赖从⽗pom⽂件中迁移到了bill-service⼦pom⽂件,⾝为同级的bill-model⾃然就不到啦。  所以,我们需要将lombok依赖从bill-service,迁移到bill-model。
  前⾯也说了,只要其它同级模块引⼊这个模块,其它模块就也能直接使⽤Lombok注解,⽆需重新引⼊jar依赖。
  第五步:迁移web层。 
  鉴于上⾯相同⽬录导致迁移失败的问题,我们还是⼿动创建包名好了。
  总之,在idea中进⾏迁移会引发各种各样的路径问题,真是能恶⼼死⼈,只能⾃⼰逐个排查或这等报错再改啦。
  迁移完毕
  bill项⽬下的src变得空空如也,直接将这个src删除即可。
  也许,我们的项⽬所有模块都会变成这个吊样,真是想骂街:
  都被强制加⼀个web包。
  只能通过重命名后再将web⽬录删除。
  需要提醒⼀点:
  启动类是放在项⽬根⽬录下的,即:和web同级,别像我⼀样,改着改着改懵了,把它们也放到了web⽬录下,
  导致的结果就是:
  启动项⽬后,⼀直报错:不到注⼊的service模块类,A component required a bean springboot结构
  添加模块依赖;
  说明:
  第⼀,引⼊的模块,必须指定版本号,不能省略<version>标签;
  第⼆,版本号的值可以跟随项⽬通过,通过${project.version} 取值。
  迁移jar包;
  把⽗pom⽂件中所剩下的jar包依赖全部迁移到bill-web的pom⽂件中(⽗l中最好⼀个jar包依赖都不要留)。
  bill-web的pom⽂件,除了模块依赖,通常情况下只有单元测试和springboot相关依赖。
  重新编译bill-web⽬录,解决报错路径问题。
  修改启动类注解扫描包;
  dao路径改成正确的
  修改⽇志配置⽂件关于dao层的引⽤
  修改关于控制层路径引⽤
  迁移项⽬构建⼯具;
  将⽗l打包⽅式设为pom;
  项⽬公共属性配置,也在⽗pom⽂件中进⾏,⼦pom⽂件通过${}引⼊即可。
  如果需要多环境⽀持,在⽗pom中添加profile即可。
  ⽗pom⽂件,还可以配置maven中央仓库
  模块出错
  如果创建出来的模块或者在迁移过程中导致java或resources⽬录发⽣了变化:变成了普通⽬录,就需要将该模块删除,重新创建。  删除模块
  第⼀步:remove module
  选中要删除的模块,右键,选择“Remove Module”。
  从项⽬移除成功后,⽂件夹将会变⾊;
  右键--》删除即可。
  但是,如果再次重建这个模块时(模块名称⼀致),出现模块已存在的情况时,可以这样做:
  关闭项⽬,然后从磁盘中删掉项⽬,从svn或git上重新将整个项⽬下载下来再重新新建模块(重头再来)。
4.关于View层能否从Web层剥离出来的探究
  剥离步骤:
  第⼀步:创建view模块,并将web/main⽬录下的webapp⽬录迁移到view/main下
  第⼆步:web模块引⼊view模块依赖
此时,要跳转的页⾯路径已经不到了。
  第四步:重新导包并启动项⽬;
  项⽬启动正常
  浏览器访问跳转到jsp的请求
  经过以上测试发现:⽆法将前端界⾯从web模块进⾏剥离。
也就是说:要想由控制层Controller来决定最终跳转的页⾯的话,页⾯和Controller需要在同⼀个模块⾥。
5.运⾏
  改造完毕后,还是像不分模块之前那样,直接⽤main⽅法启动类启动项⽬即可。
  根本不需要所谓的在l中指定唯⼀的main⽅法⼊⼝。
  可能会出现这种情况:
  解决办法:
  点击这个启动类,选择“Edit Configurations”
  打开配置页⾯
  在这⾥,我们会看到底部错误信息提⽰:在bill模块中不到这个启动类。
  实际上,bill是⼀个项⽬⽽不是模块,我们只需要将模块指定成该启动类所在模块即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。