一,为什么要使用多模块?

1,结构更清晰,方便管理
   如果只是一个小项目当然没有问题,
   但如果功能越增越多则管理越来越复杂,
   多模块可以使项目中模块间的结构分离
 
2,把项目划分成多个模块后,
能够方便模块的复用
例如:web/api/管理后台
都会用到一些数据表,
对数据表的封装(mapper)会是都需要复用的模块
 
3,减少各个模块对不必要功能的依赖,
   
4,不同的模块可以由不同的工程师来维护,
      避免重要的代码被经验不足的工程师改动受影响 
 

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

 

二,演示项目的相关信息

1,项目地址:
https://github.com/liuhongdi/multimodule
2,项目说明:
   我们创建两个子模块:
 
   business模块: pojo/mapper这些功能都在这个模块中
 
   web模块: controller/service等功能在这个模块中
 
3,项目结构:如图:

三,创建一个空的父项目

1,新建一个空项目:
 
说明:项目group为:com.multimodule
artifact用: demo
依赖保持为空,点next
指定位置后点 finish
 
2,修改pom.xml
增加一行:
    <packaging>pom</packaging>
说明:表示使用打包时使用maven的分模块管理打包
 
新增module
    <modules>
<module>business</module>
<module>web</module>
</modules>
 
删除pom.xml中的build这个tag
删除pom.xml中的dependencies这个tag
说明:目的是各个module各自添加自己的依赖
 
附:最终的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.multimodule</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging> <modules>
<module>business</module>
<module>web</module>
</modules> <properties>
<java.version>11</java.version>
</properties> </project>
3,因为父项目不需要实现其他功能,
   我们删除不需要用到的文件
   (不删除也不影响使用):
 
   删除src目录
   删除mvnw
   删除mvnw.cmd
   删除help.md
   删除.mvn 
 

四,创建子项目business:

1,创建模块
在父项目上右击->new->module
 
artifact命名为business
依赖选择页面,保留为空,点next
模块名字和目录,使用business,点finish 
 
2,配置pom.xml
因为business不会被直接运行,
所以我们删除它的 build这个tag
 
修改parent的值:
    <parent>
<groupId>com.multimodule</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent> 
groupId,artifactId,version这三项信息,就用父项目的信息即可
 
3,删除启动文件
    这个模块不需要单独启动
所以删除:src/main/java/com.multimodule.business/BusinessApplication.java 
 

五,创建子模块web:

1,创建web模块
在父项目上右击->new->module
group命名为 com.multimodule,
artifact命名为:web
依赖选中spring web,因为此模块需要独立运行
名字和位置命名为web,点finish
 
2,配置pom.xml
这个模块会直接运行,所以不删除build项
 
修改parent的值,值用父项目的相关信息即可:
    <parent>
<groupId>com.multimodule</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
增加对business模块的依赖
        <dependency>
<groupId>com.multimodule</groupId>
<artifactId>business</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
3,启动文件不可删除,
    因为此模块需要直接运行 
 

六,配置文件说明:

1,web模块/application.properties
#error
server.error.include-stacktrace=always
#errorlog
logging.level.org.springframework.web=trace #mysql
spring.datasource.url=jdbc:mysql://localhost:3306/store?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=lhddemo
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #mybatis
mybatis.mapper-locations=classpath:/mapper/*Mapper.xml
mybatis.type-aliases-package=com.example.demo.mapper
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2,创建数据表的sql:

CREATE TABLE `goods` (
`goodsId` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`goodsName` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'name',
`subject` varchar(200) NOT NULL DEFAULT '' COMMENT '标题',
`price` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT 'stock',
PRIMARY KEY (`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品表'

七,java代码说明:

1,business模块/Goods.java
public class Goods {
//商品id
Long goodsId;
public Long getGoodsId() {
return this.goodsId;
}
public void setGoodsId(Long goodsId) {
this.goodsId = goodsId;
} //商品名称
private String goodsName;
public String getGoodsName() {
return this.goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
} //商品标题
private String subject;
public String getSubject() {
return this.subject;
}
public void setSubject(String subject) {
this.subject = subject;
} //商品价格
private BigDecimal price;
public BigDecimal getPrice() {
return this.price;
}
public void setPrice(BigDecimal price) {
this.price = price;
} //库存
int stock;
public int getStock() {
return this.stock;
}
public void setStock(int stock) {
this.stock = stock;
} public String toString(){
return " Goods:goodsId=" + goodsId +" goodsName=" + goodsName+" subject=" + subject+" price=" + price+" stock=" + stock;
}
}

2,business模块/GoodsMapper.java

@Repository
@Mapper
public interface GoodsMapper {
//get all goods
List<Goods> selectAllGoods();
}

3,business模块/GoodsMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.multimodule.business.mapper.GoodsMapper">
<select id="selectAllGoods" resultType="com.multimodule.business.pojo.Goods">
select * from goods order by goodsId desc
</select>
</mapper>
4,web模块/HomeController.java
@RestController
@RequestMapping("/home")
public class HomeController { @Resource
private GoodsMapper goodsMapper;

//打印数据库中所有的商品
@GetMapping("/home")
public String all() {
List<Goods> goodsList = goodsMapper.selectAllGoods();
String retStr = "";
for (Goods goodsOne : goodsList) {
String oneStr = goodsOne.toString()+"<br/>";
//i++;
retStr += oneStr;
}
return retStr;
}
}

八,测试运行

1,启动:

注意此时需要在web模块的启动文件:WebApplication上右键->选择: Run WebApplication

2,访问: 
http://127.0.0.1:8080/home/home

输出如图:

有数据返回,表示正常运行

 

九,查看spring boot版本:

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.2.RELEASE)

spring boot:构建多模块项目(spring boot 2.3.1)的更多相关文章

  1. Spring Boot构建的Web项目如何在服务端校验表单输入

    本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...

  2. Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口

    问题描述 Spring Boot + JPA 多模块项目,启动报异常: nested exception is org.springframework.beans.factory.NoSuchBean ...

  3. maven 单独构建多模块项目中的单个模块

    maven 单独构建多模块项目中的单个模块, maven选项说明 -pl, --projects Build specified reactor projects instead of all pro ...

  4. 基于SpringBoot构建分模块项目

    前言 步骤过于详细,多图慎入!!! 假设一个场景,要开发一个4s店维修部的办公系统,其功能有:前台接待,维修抢单,财务结算,库存管理.于是我们创建一个项目balabalabala写完交工. 一段时间后 ...

  5. 使用Maven构建多模块项目

    [转] 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层).dao(数据库访问层).service(业务 ...

  6. Spring-Boot构建多模块项目

    Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...

  7. Maven学习(五)使用Maven构建多模块项目

    使用Maven构建多模块项目 一般的web项目构成: 建立解决方案目录parent 首先使用命令进入到我们需要建立maven项目的目录: mvn archetype:generate -DgroupI ...

  8. Maven单独构建多模块项目中的单个模块

    Maven单独构建多模块项目中的单个模块   说明: 1.可能存在的场景,多模块项目没有互相引用,那么此时可以单独构建单个项目,指定到子模块的pom.xml文件即可完成编译. 2.如果多模块项目各自都 ...

  9. (转)Maven学习总结(八)——使用Maven构建多模块项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(八)——使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为doma ...

随机推荐

  1. 抽象工厂模式详解 —— head first 设计模式

    项目实例 假设你有一家 pizza 店,你有很多种 pizza,要在系统中显示你所有 pizza 种类.实现这个功能并不难,使用普通方式实现: public class PizzaStore { Pi ...

  2. mac如何安装YaPi

    首先介绍一下YaPi是干什么的. 帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理.免费 ...

  3. pthon中取整的几个方法round、int、math

    取整的几种方法:1.四舍五入 round(x) 2.向下取整  int(x) 3.取商和余 4.向上取整,需要用到math.ceil(x)(可以理解成大于x且最接近x的整数)import math 5 ...

  4. 吴恩达《深度学习》-课后测验-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究))

    Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究)) 1.Problem Statement ...

  5. python面向对象单继承,多继承和super()调用

    python 目录 python 1.继承 1.单继承 2.多继承 3.子类重写父类的同名属性和方法 核心点: 4.多层继承 5.super()的使用 1.继承 1.单继承 说明: 虽然子类没有定义_ ...

  6. 使用phoenix连接hbase

    hbase本身不支持SQL查询,为了实现这个功能,引入了phoenix,通过它可以实现hbase的sql查询.这里记录下如何配置并使用phoenix来操作hbase. 1. 下载地址 phoenix下 ...

  7. Linux实战(16):Centos history命令进阶

    因在使用history命令是发现历史命令不同步,没有时间戳,在查看历史操作的时候很不方便,特查询了相关文档,发现可通过系统自带的logger来记录跟踪,历史命令执行的用户,时间,登录IP. vim / ...

  8. Java 里的 for (;;) 与 while (true),哪个更快?

    在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s? ...

  9. SSM框架整合 IDEA_Maven

    首先是配置web的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  10. 微信小程序结合微信公众号进行消息发送

    微信小程序结合微信公众号进行消息发送 由于小程序的模板消息已经废弃了,官方让使用订阅消息功能.而订阅消息的使用限制比较大,用户必须得订阅.需要获取用户同意接收消息的权限.用户必须得和小程序有交互的时候 ...