一个应用业务量增多的时候,可以使用多模块,一些代码可以重用,后期也便于维护。
自己上手的记录下,方便后看。
文章目录
- 1,创建父工程
- 2,创建子模块
- 3,编辑父工程 pom.xml 文件
- 将父工程 pom.xml 文件修改成如下内容,里面声明该父工程包含的子模块,同时抽取统一的配置信息和依赖版本控制,这样可以方便子 pom 直接引用,简化子 pom 的配置。
- 4,编辑子模块 pom.xml 文件
- 5,移动项目启动类所在的包
1,创建父工程
(1)首先,先创建一个 Spring Initializr 工程 hangge 作为 父工程(不添加任何依赖):
(2)删除刚创建工程里不需要的文件, 只保留:.idea 文件夹 、项目 pom 文件、以及一个 *.iml 文件。
注意: 因为父模块只做依赖管理,不需要编写代码,所以 src 文件夹可以直接删除。
2,创建子模块
(1)右键点击父工程,选择 New -> Module… 创建子模块。这里依次创建 hangge-base、hangge-dao、hangge-service 和 hangge-web 共 4 个模块。
注意:除了 hangge-web 子模块创建时选择添加 Spring Web 依赖(当然也可以创建时不添加,等后面再手动编辑 pom.xml 文件添加),其他模块暂时不添加依赖。
(2)将 4 个子模块的 mvnw、mvnw.cmd 文件及 .mvn 文件夹全部删除。
(3)对于 src 里的内容,只保留 hangge-web 的启动类和配置文件,其他子模块的的启动类和配置文件都删除:
3,编辑父工程 pom.xml 文件
将父工程 pom.xml 文件修改成如下内容,里面声明该父工程包含的子模块,同时抽取统一的配置信息和依赖版本控制,这样可以方便子 pom 直接引用,简化子 pom 的配置。
多模块项目中,父模块打包类型必须是 pom。
<?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>
<groupId>com.example</groupId>
<artifactId>hangge</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hangge</name>
<description>Demo project for Spring Boot</description>
<!-- 父模块打包类型必须为pom -->
<packaging>pom</packaging>
<!-- parent指明继承关系,给出被继承的父项目的具体信息-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 模块说明:这里声明多个子模块 -->
<modules>
<module>hangge-base</module>
<module>hangge-dao</module>
<module>hangge-service</module>
<module>hangge-web</module>
</modules>
<!-- 版本说明:这里统一管理依赖的版本号 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
4,编辑子模块 pom.xml 文件
(1)子模块 hangge-base 的 pom.xml 文件内容如下,其中 parent 要使用顶层的父模块,同时由于我们项目用到了 Lombok ,所以还添加了 lombok 依赖。注意:由于子模块的配置信息会继承父模块的,所以子模块原来的 properties 可删掉。
<?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>
<groupId>com.example</groupId>
<artifactId>hangge-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hangge-base</name>
<description>Demo project for Spring Boot</description>
<!-- 继承本项目的父工程 -->
<parent>
<groupId>com.example</groupId>
<artifactId>hangge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
</dependencies>
</project>
(2)子模块 hangge-dao 的 pom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-base 子模块,以及数据库相关依赖:
<?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>
<groupId>com.example</groupId>
<artifactId>hangge-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hangge-dao</name>
<description>Demo project for Spring Boot</description>
<!-- 继承本项目的父工程 -->
<parent>
<groupId>com.example</groupId>
<artifactId>hangge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!-- dao 子模块又依赖 base 子模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-base</artifactId>
</dependency>
<!-- Spring Data JPA 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 数据库驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
</dependencies>
</project>
(3)子模块 hangge-service 的 pom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-dao 子模块依赖:
<?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>
<groupId>com.example</groupId>
<artifactId>hangge-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hangge-service</name>
<description>Demo project for Spring Boot</description>
<!-- 继承本项目的父工程 -->
<parent>
<groupId>com.example</groupId>
<artifactId>hangge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!-- service 子模块又依赖 dao 子模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-dao</artifactId>
</dependency>
</dependencies>
</project>
(4)子模块 hangge-web 的 pom.xml 文件内容如下,同样 parent 要使用顶层的父模块,并添加 hangge-service 子模块依赖:
<?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>
<groupId>com.example</groupId>
<artifactId>hangge-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hangge-web</name>
<description>Demo project for Spring Boot</description>
<!-- 继承本项目的父工程 -->
<parent>
<groupId>com.example</groupId>
<artifactId>hangge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<!-- web 子模块又依赖 service 子模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>hangge-service</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5,移动项目启动类所在的包
目前项目启动类 HanggeWebApplication 在 com.example.hanggeweb 包下面,我们需要将其移动移动到 com.example 包下。 如果不移动启动类的话,在多模块项目中会可能会碰到一个模块无法通过 @Autowired 注入其他模块里的对象的问题。启动时会报类似如下的错误:
Field bookService in com.example.hanggeweb.controller.HelloController required a bean of type ‘com.example.hanggeservice.BookService’ that could not be found.