在 IntelliJ IDEA 中使用 Maven 创建父与子多模块项目是一个常见的开发实践,有助于更好地组织和管理代码。在多模块项目中,可以将公共的代码、资源或配置抽离到独立的模块中,然后在其他模块中直接引用。这样可以避免代码重复,提高代码的重用性。
父模块可以统一管理依赖的版本和配置,子模块则继承这些配置。这样不仅简化了依赖管理,还确保了项目中所有模块使用的依赖版本一致,减少了因版本不一致导致的冲突和错误。多模块项目允许将项目按照功能或业务进行分割,每个模块都有自己的职责和功能。这使得项目结构更加清晰易懂,方便开发者进行模块化管理。
1、创建父工程
(1)使用 IDEA 新建父工程。
(2)删除父工程下多余的文件和文件夹。
2、创建子模块
(1)右键父工程,选择“新建”,然后选择“新模块”。
(2)创建子模块。
分别创建3个子模块:
com-pjb-proudct:商品模块。
com-pjb-order:订单模块。
com-pjb-member:会员模块。
注意:子模块的组名(包名)必须与父工程的一致。
(3)继续创建其余的子模块
3、父工程的 Maven 配置
(1)设置父工程的包为 pom(必须)。
<!-- 设置父工程的包为 pom -->
<packaging>pom</packaging>
(2)关联子模块。
<!-- 关联子模块-->
<modules>
<module>com-pjb-proudct</module>
<module>com-pjb-order</module>
<module>com-pjb-member</module>
</modules>
(3)设置 <dependencyManagement> 节点。
Maven 中的 <dependencyManagement>节点,用于父工程POM中定义依赖的版本和配置,而不实际引入这些依赖。它提供了一种集中管理和控制项目中所有模块或子项目所使用的依赖项版本的方式。
通过 <dependencyManagement> 节点,可以在父POM中统一声明依赖项的版本,子模块在引用这些依赖时无需再显式指定版本号,从而确保所有子模块使用的都是同一版本的依赖。
在父 POM 的 <dependencyManagement> 部分,使用 <dependencies> 元素包裹一系列的 <dependency> 元素,每个 <dependency> 元素指定一个依赖项的 groupId、artifactId 和 version。
<properties>
<spring.boot.version>2.4.2</spring.boot.version>
<lombok.version>1.18.28</lombok.version>
</properties>
<!-- <dependencyManagement>节点:用于父工程POM中定义依赖的版本和配置,而不实际引入这些依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- Lombok 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
(4)完整的父工程 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>
<!-- SpringBoot 的依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
<groupId>com.pjb</groupId>
<artifactId>MultiModule</artifactId>
<version>1.0.0</version>
<name>MultiModule</name>
<description>MultiModule</description>
<!-- 设置父工程的包为 pom -->
<packaging>pom</packaging>
<!-- 关联子模块-->
<modules>
<module>com-pjb-proudct</module>
<module>com-pjb-order</module>
<module>com-pjb-member</module>
</modules>
<properties>
<spring.boot.version>2.4.2</spring.boot.version>
<lombok.version>1.18.28</lombok.version>
</properties>
<!-- <dependencyManagement>节点:用于父工程POM中定义依赖的版本和配置,而不实际引入这些依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- Lombok 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4、子模块的 Maven 配置
(1)<parent> 节点引用父工程的依赖。
<!-- 步骤1:不再直接使用SpringBoot依赖,而是引用父工程的依赖-->
<parent>
<groupId>com.pjb</groupId>
<artifactId>MultiModule</artifactId>
<version>1.0.0</version>
</parent>
(2)设置子模块的包为 jar(必须)。
<!-- 步骤2:设置子模块的包为 jar -->
<packaging>jar</packaging>
(3)完整的子模块 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>
<!-- 步骤1:不再直接使用SpringBoot依赖,而是引用父工程的依赖-->
<parent>
<groupId>com.pjb</groupId>
<artifactId>MultiModule</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<!-- 步骤2:设置子模块的包为 jar-->
<packaging>jar</packaging>
<!-- 注意:groupId 必须与父工程一致 -->
<groupId>com.pjb</groupId>
<artifactId>Proudct</artifactId>
<version>1.0.0</version>
<name>com-pjb-proudct</name>
<description>com-pjb-proudct</description>
<!-- 子模块在引用这些依赖时无需再显式指定版本号,从而确保所有子模块使用的都是父工程同一版本的依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Lombok 依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 注意:必须加上如下配置,否则打包会报错 -->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</project>
5、启动服务
启动子模块,测试运行结果。
启动成功。