首先我们看下以下工程结构。
本案例基于maven构建 SSM(Spring+SpringMVC+Mybatis)工程,通过maven坐标进行依赖管理。最终实现根据 id 查询商品信息的功能。
假设根据 id 查询商品信息的功能的这个项目是淘宝卖家后台管理项目
运行此项目,实现根据 id 查询商品信息的功能。
以上就是一个普通的SSM整合的淘宝卖家后台管理项目结构,分为3层 controller,service,dao层,如果我们单看这一个项目,感觉没什么毛病。
但是我们假设一个场景:
假如我们是淘宝的卖家,顾客买家从店铺买下一件商品,淘宝店铺就会产生一个订单
而这个订单,淘宝的卖家和买家都可以在后台进行查看。现在就拿看订单这个操作来
说,买家要看订单,dao层(数据库持久层)就必须要把数据库中的订单数据查询出来,
而卖家要看订单,dao层(数据库持久层)也必须要把数据库中的订单数据查询出来。
双方看订单的后台操作都是一样的,都是由dao层(数据库持久层)来操作数据,获
取订单数据,所以说对于dao层来操作数据,获取订单数据。双方查看订单,后台都
是重复性的代码工作。同时,卖家和买家使用的项目app不是同一个项目app(买家一
般使用购物app,卖家一般都会有自己的后台管理系统app)而这两个项目都有一个共
同点,就是把订单数据查询出来。由上可以看出,我们可以将dao层的代码抽取出
来,放在一个公共的地方。将来不管有多少个maven工程,只需要映入这一个dao层
的代码,就都能实现查询订单的功能,而不会在每一个maven工程当中都写查询订单
的功能。也就是说,不管是商家卖家后台管理系统,还是买家使用的购物系统,都共
同使用这一个dao层代码。就都能查询出订单数据
现在问题已经找到了,那么怎么去解决它呢?
maven提供将一个完整的项目分成不同的独立模块,这些模块都有各自独立的坐标,哪个项目需要使用这个模块,就需要将这个模块的坐标依赖到项目当中即可。分模块构建maven工程的方式可以消除重复代码
企业当中如果开发一个新的的项目,我们首先考虑的问题不是dao,service,controller如何去写,而是考虑dao,service,controller,utils这些模块是否已经存在,如果存在直接引用,以上就是maven的拆分思想。
那拆分的模块项目,我们可以将他们聚合起来成为一个完整的项目,这就是maven聚合思想。
理解继承和聚合
通常继承和聚合同时使用。
何为继承?
继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml
文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的
配置提取出来在父工程的 pom.xml 中定义。
何为聚合?
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在
一起运行,比如:dao、service、web 三个工程最终会打一个独立的 war 运行。
在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以车场都会将整
个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。
1 分模块构建maven工程分析
2 maven工程的继承
3 maven工程的聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。
例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。
这时就可以使用标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此工程中执行一次打包命
令,其下被聚合的工程就都会被打包了。
4 分模块构建maven工程具体实现
1 maven-parent 父模块
1.1 创建父工程
注意:父工程的打包方式为pom,src可以删除(父工程主要管理子模块,业务代码不需要在父工程当中编写)
1.2 创建子模块maven_dao,maven_service,maven_web
其中maven_dao,maven_service的打包方式为jar,maven_web的打包方式为war,因为web子模块我们需要去集成页面及静态资源(maven模块化工程,总有一个子模块的打包方式为web,因为一个项目是有页面的)
以上开始创建的3个子模块之间是没有任何关系的,但是我们知道,在项目当中,service是需要依赖dao的,dao获取数据库数据之后将数据返回给service
那如何将maven_dao,maven_service两个子模块建立关系。
同理maven_web子模块需要依赖maven_service模块
基于以上的maven分模块工程,现在如果这个项目需要映入别的项目,只需要将要引入的项目打成一个jar包同时放在仓库当中,然后我们就可以在这个项目当中直接引入这个外来的项目的坐标即可。
1.3 父工程定义 pom.xml
在父工程的 pom.xml 中抽取一些重复的配置的,比如:锁定 jar 包的版本、设置编译版本等。
1.4 运行模块工程项目
方式一:
方式二:
这种使用web子模块的插件运行项目,会报错
原因就是,web模块依赖service模块,而项目启动的时候,会去本地仓库查找是否存在maven_service依赖jar,以下报错就是因为本地仓库没有maven_service依赖jar,再去中央仓库下载,而中央仓库是不可能存在这个jar依赖的。所以,我们需要将maven_service依赖jar安装到本地仓库,再启动web工程。那么这样去做真的可以成功运行项目吗?其实是不可以的,因为,即使maven_service依赖jar安装到本地仓库,本地仓库还是没有maven_dao依赖jar,所以,我们直接将父工程安装到本地仓库,就可以了。
再次运行,发现项目成功启动。
方式三(使用本地的tomcat):