28个步骤快速搭建基于SpringBoot的Maven多模块Java Web项目
背景:平常一般的web项目,通常会使用SSH(Struts+Spring+Hibernate)、SSM(SpringMVC+Spring+Mybatis)等框架,普通的独立的比较小的项目只需要使用单模块就能满足。
单模块——
优点:简单明了,便捷使用。
缺点:每次修改一个文件,都要整体打包,不利于扩展,随着项目越来越大,比较臃肿,build的时间过长,难以维护。
经过项目的不断发展和添加功能需求,为了适应这种变化,需要有先见之明,搭建好可以扩展的多模块项目,用Maven管理的比较大的项目大部分都是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合相互关联。
多模块——
优点:结构清晰,方便分模块打包,分模块开发,分模块部署,有利于扩展,方便管理维护,遵守设计模式原则“高内聚,低耦合”。
缺点:随着项目变大,模块变多,自然变复杂。
多模块JavaWeb项目结构设计:
简约式分层结构:
system-parent(项目父目录)
----pom.xml
----system-domain(域模型层)
----pom.xml
----system-dao(数据库访问层)
----pom.xml
----system-service(业务逻辑层)
----pom.xml
----system-web(表现层)
----pom.xml
分布式分层结构:
system(项目父目录,一般写项目名作为父目录、根目录)
----pom.xml
----system-model(数据模型层、实体层,可用entity、domain表示)
----pom.xml
----system-dao(数据库访问层)
----pom.xml
----system-dao-impl(数据库访问实现层,如果用mybatis这里框架可以省略这层)
----pom.xml
----system-service(业务逻辑接口层)
----pom.xml
----system-service-impl(业务逻辑接口实现层,使用dubbo时,要发布该层)
----pom.xml
----system-web(表现层、可用controller控制表现层表示)
----pom.xml
----system-common(公共通用层、存放些base类等)
----pom.xml
----system-utils(工具层、存放些工具类等)
----pom.xml
----system-rabbitmq(独立模块功能层,根据需要可以多个功能模块层,例如cas, redis等)
----pom.xml
以上分布式分层的各个模块是聚合关系;
聚合关系——多模块里的模块都是聚合关系,把多个能独立运行的模块聚在一起,这些子模块可以是平行独立关系,也可以是继承关系(假如,rabbitmq继承utils,虽然是父子关系,也可以一起聚合在system这个父目录下)。
继承关系——为了消除重复,不重复引用jar包,假如设置rabbitmq继承utils,rabbitmq就可以不在重复引用jar,都可以使用utils已经有的jar包。
依赖关系——在任何独立maven项目里,例如utlis项目里,需要使用apache项目里的common-lang3包,就可以依赖引用该jar包。
举个栗子——
一个大项目需要使用聚合、继承、依赖关系来组成。
在system大项目里,不只一个web项目,因为业务发展需要有两个后台项目和一个公共包项目,web1项目(dao+service+utils),web2项目(dao+service+common),tools公共包项目(utils+common+rabbitmq)。
那么system里聚合着web1、web2、tools、dao、service、utils、common、rabbitmq这些子模块项目,不管他们之间是平行关系,还是父子继承关系。聚合父目录,只是一个大容器,把里面能独立执行的子模块都展示出来,不管子模块之间又有什么关系,其关系都在配置中体现出来。
rabbitmq项目继承了utils项目,他俩是继承关系。
web1项目要运行起来,需要有dao、service、utils这些模块支持,他们是依赖关系。当需要另外建立一个可运行的web3项目,也需要依赖dao、service等模块,可以根据需要添加依赖到web3项目里,web1、web3和其他模块一起聚合在system这个父目录,方便管理,方便依赖组合。
聚合、继承、依赖关系都体现了面向对象的原则。子模块之间通过继承、依赖相互组合,形成一个可以运行的jar、pom、war包项目,再统一聚合在system父模块里,方便管理各个模块。
实战——
使用idea搭建一个maven多模块java web项目(使用分布式分层结构)
idea版本:IntelliJ IDEA 2017.2.6
开发前准备:需要配置maven,1)先下载maven,win安装版本,下载地址在:http://maven.apache.org/download.cgi;2)解压在安装目录下,配置环境变量;3)在其conf目录下的settings.xml,把本地仓储目录和远程仓储地址,或镜像地址配置好,这样才会下载相应jar包比较快速,国内比较好用的镜像如 阿里云的镜像站(首推,新站,速度暴快):
本地配置如:<localRepository>H:/repository</localRepository>
镜像配置如:在mirrors标签下加上如下
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4)在idea的maven配置上,使用该本地的安装好的maven,如下:
开始建立maven多模块工程——
1. new project 新建maven project;
2. 首先创建项目父目录,root目录,所以,不需要建立archetype结构原型(maven项目模板),不用在create from archetype打勾,直接默认建立maven父工程,普通的pom打包模式,直接点击next;
3. 在GroupId输入组织id号,一般用“.”点号来间隔;ArtifactId输入项目名称(项目根目录),一般用“-”横杠来间隔;Version输入版本号,snapshot快照版本,release发布版本;输入完毕,点击Next;
4. 由于idea会把filepath换成一个单词,可以一眼看出结构,有结构有条理,还是把jibook换成ji-book,项目名称用“-”横杠作为分词;点击Finish,新建多模块javaweb项目的父目录;
5. 由于自动生成的pom.xml,是没有打包配置,需要在父目录的pom文件里添加packaging为pom;
6. 新建项目ji-book的model层子目录,project栏里右击ji-book父目录,选择new-->Module;
7. model子目录也是默认建立jar打包方式的工程,不用使用maven模版,不用打勾create from archetype,点击Next;
8. add as module to 和 parent都选择ji-book做父目录;GroupId和Version都跟父目录一样;ArtifactId子项目名为ji-book-*,这样的命名,跟maven的仓库里的坐标命名方式一致;点击Next;
9. 为了保持层次感和目录一致,把整合起来的一个单词jibookmodel变成用“-”来间隔的path路径;
改变成如下,最后点击Finish;
10. 由于model层子模块是打包成jar的模式,要在pom.xml添加打jar包的打包方式;
11. 建立dao层、service层、service-impl层、utils层、common层的子模块都按照建立model层的子模块一样的操作,重复6-10步;
12. 建立web层子模块,由于web子项目是web项目,需要打包成war包的,首先new-->module;
13. 因为要建立web工程,需要使用maven模版,在create from archetype打勾,选择maven-archetype-webapp模板,点击Next;
14. parent、groupId、version这些都保持不变,ArtifactId输入web子项目的名称,点击Finish;
15. 选择maven的安装目录,settings.xml的maven配置文件的path,local repository本地仓储的path目录;查看建立web项目的项目参数,确认无误,点击Next;
16. 输入module name子模块名字,还有子模块的path目录;最后点击Finish;
17. 点击Finish之后,idea会自动生成webapp项目,自动生成打包方式为war包的pom.xml配置;自动在src目录下有webapp目录,有web项目的标准文件WEB-INF目录下的web.xml配置文件;
PS:
没有java源代码目录?
由于上面只有resources和webapp文件夹存放相关资源,没有java来存放java源代码,这个需要自己去建立,并且还要更新ji-book-web.iml的idea特有的配置文件,有时候rebuild,clean之后都不能马上更新得到。
更新idea的配置文件的方法:删除隐藏的idea文件夹,关掉idea编辑器,再重新打开能重新导入maven-project。
另一种新建ji-book-web工程方法:
1)根model模块一样,不用使用maven模版,不用打勾create from archetype,点击Next;
2)接下来的命名,目录,父模块等设置跟model模块一样;
3)在pom.xml文件里添加<packaging>war</packaging>,这样就可以打出war包;
4)在src/main文件夹下创建Java代码文件夹java、resources资源配置文件、webapp的文件夹下放WEB-INF文件夹存放web信息配置,还有web.xml项目配置文件;
这样就可以在方便地搭建java-web项目,又可以随时更新idea的配置文件ji-book-web.iml。
18. 编写建表SQL,在dao层里的资源目录resources新建一个存放sql语句的目录;
命名为ji-book-sql,存放工程里的sql命令文件;
19. 设计User数据表结构,新建create_table_sql.sql建表sql文件来编写建表sql语句;
PS: 工程、目录之间用“-”横杠间隔,文件等用“_”下划线来间隔;
新建create_table_sql.sql建表sql文件
编写User的建表sql:
--用户表 add by