写在前面 Spingboot项目对开发来说,最简单的当然是单模块开发,只有一个pom文件。但随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂,比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便。那么这里呢,我就来讲解一下如何使用SpringBoot来构建分模块项目,如果觉得有用,记得点个关注和点个赞哦 。
准备 我们这个项目呢使用的是Idea进行演示,JDK版本是1.8,然后准备构建的项目模块如下(我自己的习惯分的模块,这里只是用于演示,你可以按照你的习惯分模块)
entity:包含实体类目
dao:包括持久化类目
service:包含业务逻辑类目
web:api层面或者是视图层
这里说明一下我们这里的web可以理解成应用层,其他子模块理解为公共层,然后这样的话,我们可以有多个web层(web1、web2…),这样我就可以就可以实现多个应用服务集成在一起(更确切的说,叫做同一个业务分离详细,比如一个企业管理系统,拆分成财务系统、人事系统等等),不过要注意了,这样做的话,创建子模块的时候,除了web模块以外,要删除其他模块的Applicatin启动项,和resources目录下的application.properties配置文件。
这三个模块依赖的关系如下
web依赖entity、dao、service
service依赖dao、entity
dao依赖entity
entity独立,谁都不依赖
创建父工程 首先呢,我们先通过Idea的Spring Initilazr创建一个啥场景启动器都不包含的空SpringBoot项目,然后把下图所示的多余文件全部删掉,只剩下一个pom.xml,当然,如果你习惯用mvn指令运行,就不要删了(Idea的工具文件删不删都无所谓,因为你运行后,idea还是会创建的)。 到这一步,我们的父模块就创建完成,此时的pom文件内容如下,此pom即是下文所说的父pom文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <?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.2 .5 .RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
创建子模块 我们上面创建好了父工程,现在我们可以在父工程的基础上来创建上面提到的三个子模块,子模块的创建方式很简单,具体步骤如下 然后我们创建一个SpringBoot空项目,啥都不选(当然,如果我们创建的模块,不需要交给SpringBoot管理,我们可以直接创建一个空的Maven项目,但是由于我们创建的)
此处填写的name就是我们的模块名,创建该模块时,如果第一步选中了父模块,那么此处GroupId和Version都会自动填充,如果没有自动填充,说明创建该模块的时候没有选中。 src下的启动项以及配置文件也记得删除,然后现在按照上面的步骤,把其他三个子模块都创建出来,最后创建工程如下
添加依赖关系 先说明一个注意的点,这个是父工程的pom.xml的内容,这里指出来是说我们项目的打包方式是pom,不是jar,但是你去子模块的pom.xml里就会发现,没有packing这个标签,说明是jar的形式(当然你如果不放心,也可以加packing标签过去,声明jar形式)。
然后我们现在开始配置父工程以及子模块的pom.xml依赖关系,首先是父工程的pom.xml的内容,配置内容如下,父工程中不配置web模块哦,只配置公共模块,然后以后一些公共依赖,都可以直接放在父工程的pom.xml里面进行统一版本号管理(注意了,这里知识管理版本号,并不是引入依赖,哪个模块需要哪个依赖,还是需要自己引入)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?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" > <!-- 继承说明:这里继承SpringBoot提供的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2 .5 .RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 项目说明:这里作为聚合工程的父工程 --> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <!-- 基本信息 --> <modelVersion>4.0 .0 </modelVersion> <packaging>pom</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> <demo.version>0.0 .1 -SNAPSHOT</demo.version> </properties> <!-- 模块说明:这里声明多个子模块 --> <modules> <module >dao</module > <module >entity</module > <module >service</module > <module >web</module > </modules> <!-- 版本说明:这里统一管理依赖的版本号 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>dao</artifactId> <version>${demo.version}</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>entity</artifactId> <version>${demo.version}</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>service</artifactId> <version>${demo.version}</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>web</artifactId> <version>${demo.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
然后我这里就直接把service、dao、entity三个子模块的pom.xml内容直接贴出来
dao 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <?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>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>dao</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>dao</name> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>entity</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
entity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?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>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>entity</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>entity</name> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <?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>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>service</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>service</name> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>entity</artifactId> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>dao</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
现在我们来配置web应用模块,这个模块相对于其他模块比较特殊,因为它有着启动入口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <?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>com.example</groupId> <artifactId>demo</artifactId> <version>0.0 .1 -SNAPSHOT</version> <relativePath>../pom.xml</relativePath> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>web</artifactId> <version>0.0 .1 -SNAPSHOT</version> <name>web</name> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8 </java.version> </properties> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>entity</artifactId> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>service</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
每个web模块对应一个main方法,启动时找到各自的main方法,点击启动即可,idea一般会自动检测SpringBoot程序入口,想跑哪个点哪个,最后的目录结构如下,我们可以空跑一下项目,是没有问题的,但是为了更好的理解,接下来我们编写一些测试代码进行测试。
编写子模块代码 Web模块 我们在web子模块中创建两个Controller类,UserController和HelloController两个类,如下 UserController内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController @RequestMapping("/user/*") public class UserController { @Autowired UserService userService; @GetMapping("list") public R list () { try { List<User> list = userService.list(); return R.isOk().data(userService.list()); } catch (Exception e) { return R.isFail(e); } } }
application.properties内容如下:
1 2 3 4 5 6 7 8 9 10 spring.jpa.hibernate.ddl-auto =update spring.jpa.show-sql=true spring.jpa.properties.hibernate.hbm2ddl.auto =update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.properties.hibernate.format_sql=true spring.datasource.url=jdbc:mysql: spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
service模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;@Service public class UserServiceImpl implements UserService { @Autowired UserRepository userRepository; @Override public List<User> list () { return userRepository.findAll(); } }
Entity模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity @Table(name = "T_USER" ) public class User { @Id @Column(name = "USERID" ) public String userId; @Column(name = "USERNAME" ) public String username; @Column(name = "PASSWORD" ) public String password; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 import java.io.Serializable;public class R < T> implements Serializable { private static final long serialVersionUID = -4577255781088498763L ; private static final int OK = 0 ; private static final int FAIL = 1 ; private static final int UNAUTHORIZED = 2 ; private T data; private int status = OK; private String msg = "" ; public static R isOk () { return new R(); } public static R isFail () { return new R().status(FAIL); } public static R isFail (Throwable e) { return isFail().msg(e); } public R msg (Throwable e) { this .setMsg(e.toString()); return this ; } public R data (T data) { this .setData(data); return this ; } public R status (int status) { this .setStatus(status); return this ; } public R () { } public T getData () { return data; } public void setData (T data) { this .data = data; } public int getStatus () { return status; } public void setStatus (int status) { this .status = status; } public String getMsg () { return msg; } public void setMsg (String msg) { this .msg = msg; } }
Dao模块
1 public interface UserRepository extends JpaRepository <User ,String > { }
启动项目之后,成功创建数据表,并返回结果,如下
多模块打包 多模块项目仅仅需要在启动类所在的模块添加打包插件即可!!不要在父类添加打包插件,因为那样会导致全部子模块都使用spring-boot-maven-plugin的方式来打包(例如BOOT-INF/com/example/xx),而web模块引入xx 的jar 需要的是裸露的类文件,即目录格式为(/com/example/xx)。
首先在IDE打开Maven插件,然后在聚合父工程中点击 clean ,然后点击 package 进行打包。如图:
Author:
DengBoCong
Permalink:
http://dengbocong.cn/Spring-Boot/8acc7bd801a8/
License:
Licensed under the Apache License, Version 2.0 (the "License")
Slogan:
Stay hungry, Stay foolish.