当前位置: 首页 > news >正文

SpringBoot开发——Maven多模块工程最佳实践及详细示例

文章目录

  • 一、前言
  • 二、Maven多模块工程的最佳实践
    • 1、项目结构清晰
    • 2、依赖管理统一
    • 3、插件配置统一
    • 4、版本控制一致
    • 5、模块间通信简化
  • 三、详细示例
    • 1、项目结构
    • 2、父模块(parent)的pom.xml文件
    • 3、子模块(module-api)的pom.xml文件
    • 4、模块间依赖示例
  • 四、关于${project.version}

一、前言

在大型软件开发项目中,项目模块的划分和管理至关重要。Maven多模块项目架构是一种高效的项目组织方式,通过将项目划分为多个模块,每个模块负责一个特定的功能,可以提高项目的可维护性和可扩展性。本文将详细介绍Maven多模块工程组织的最佳实践,并给出一个详细示例。

二、Maven多模块工程的最佳实践

1、项目结构清晰

  • 项目应该按照功能、业务或技术划分模块,每个模块应该有明确的职责和边界,避免功能交叉或耦合过度。
  • 项目根目录下通常包含一个父模块(parent),管理整个项目的构建、依赖和版本控制,以及多个子模块(module),每个子模块负责一个具体的功能。

2、依赖管理统一

  • 在父模块的pom.xml文件中,通过<dependencyManagement>标签统一声明所有子模块需要的依赖及其版本号,子模块通过继承父模块来简化依赖配置。
  • 子模块可以通过<dependencies>标签添加自己特有的依赖,无需重复声明版本号。

3、插件配置统一

  • 父模块统一管理构建插件及其配置,确保所有子模块使用相同的构建流程。
  • 子模块可以根据需要添加额外的插件或覆盖父模块的插件配置。

4、版本控制一致

  • 父模块中定义项目的全局版本号,子模块继承父模块的版本号,确保整个项目的一致性。
  • 通过<properties>标签定义项目属性,如Java版本Spring版本等,子模块可以直接引用这些属性。

5、模块间通信简化

  • 使用Maven的模块间依赖机制,子模块可以直接引用其他子模块的代码和资源,简化模块间的通信和协作。
  • 通过合理定义和使用模块间的依赖关系,确保模块间的正确交互和协作。

三、详细示例

假设我们有一个多模块项目,包含以下模块:

  • parent(父模块)
  • module-api(API模块)
  • module-service(服务模块)
  • module-web(Web模块)

1、项目结构

项目结构如下:

my-multimodule-project/
|-- parent/
|   |-- pom.xml
|-- module-api/
|   |-- pom.xml
|-- module-service/
|   |-- pom.xml
|-- module-web/|-- pom.xml

2、父模块(parent)的pom.xml文件

  • 在父模块的pom.xml文件中,定义groupIdartifactIdversion
  • 使用<packaging>pom</packaging>来指定这是一个聚合项目(即多模块项目)。
  • <modules>标签中列出所有子模块。
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-multimodule-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>module-api</module><module>module-service</module><module>module-web</module></modules><properties><java.version>1.8</java.version><spring.version>5.3.10</spring.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><!-- 其他依赖 --></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!-- 其他插件 --></plugins></build>
</project>

3、子模块(module-api)的pom.xml文件

  • 在每个子模块的pom.xml文件中,使用<parent>标签来指定父模块。
  • <parent>标签中,不需要重复定义groupIdversion,因为Maven会自动从父模块中继承这些值。
  • 只需要指定父模块的groupIdartifactIdrelativePath(如果父模块不在默认位置)。
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>module-api</artifactId><packaging>jar</packaging><parent><groupId>com.example</groupId><artifactId>my-multimodule-project</artifactId><version>1.0-SNAPSHOT</version><!-- 如果父模块不在默认位置,可以指定relativePath -->  <!-- <relativePath>../parent/pom.xml</relativePath> -->  </parent><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><!-- 其他依赖 --></dependencies>
</project>

4、模块间依赖示例

假设module-service模块依赖于module-api模块,可以在module-servicepom.xml文件中添加以下依赖:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <parent>  <groupId>com.example</groupId>  <artifactId>my-multimodule-project</artifactId>  <version>1.0-SNAPSHOT</version>  <!-- 如果父模块不在默认位置,可以指定relativePath -->  <!-- <relativePath>../parent/pom.xml</relativePath> -->  </parent>  <artifactId>module-service</artifactId>  <packaging>jar</packaging>  <!-- 子模块特有的配置,如依赖、插件等 -->  <dependencies>  <dependency>  <groupId>com.example</groupId>  <artifactId>module-api</artifactId>  <version>${project.version}</version> <!-- 使用${project.version}来引用父模块的version -->  </dependency>  <!-- 这里可以添加其他依赖 -->  </dependencies>  
</project>

在上面的示例中,module-apimodule-service子模块都通过<parent>标签继承了父模块my-multimodule-projectgroupIdversion。这样,你就不需要在每个子模块中重复这些值了。通过上述配置,我们实现了一个清晰、可维护的Maven多模块项目结构。每个模块都有明确的职责和边界,依赖关系通过父模块统一管理,插件配置和版本控制也保持一致。这种项目组织方式有助于提高开发效率,降低维护成本,并方便后续扩展和升级。

四、关于${project.version}

Maven项目中,${project.version} 是一个内置的Maven属性,它代表了当前项目的版本号。这个属性是在Maven解析pom.xml文件时自动设置的,因此你不需要手动定义它。

当你使用${project.version}时,Maven会用当前项目的版本号来替换这个占位符。这个版本号通常是在项目的pom.xml文件的<version>标签中定义的。

在多模块项目中,如果子模块通过<parent>标签继承了父模块的版本号,那么子模块中的${project.version}将会解析为父模块中定义的版本号(前提是子模块没有覆盖这个版本号)。这是因为Maven在解析子模块的pom.xml时,会首先解析父模块的pom.xml,并将父模块中的信息(包括版本号)传递给子模块。

举个例子,如果你有一个父模块parent-pom,它的版本号是1.0.0,并且有一个子模块child-module,子模块的pom.xml中通过<parent>标签继承了父模块的版本号,那么在子模块的pom.xml中使用${project.version}时,它会被解析为1.0.0。

需要注意的是,虽然${project.version}在大多数情况下都很有用,但在某些情况下(比如父模块和子模块需要不同的版本号时),你可能需要在子模块中显式地定义版本号,而不是使用继承的版本号。此外,如果你在一个模块中引用了另一个模块作为依赖,并且希望确保它们使用相同的版本号,那么使用${project.version}是一个很好的做法,因为它可以确保版本的一致性。

http://www.lryc.cn/news/491774.html

相关文章:

  • C 语言面向对象
  • 无人机探测:光电侦测核心技术算法详解!
  • ffmpeg视频滤镜:替换部分帧-freezeframes
  • PHP 超级全局变量
  • Pytorch使用手册-Tensors(专题二)
  • centos安装小火车
  • 241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]
  • sklearn中常用数据集简介
  • 机器学习在教育方面的应用文献综述
  • 滑动窗口最大值(java)
  • sklearn学习
  • Ubuntu下手动设置Nvidia显卡风扇转速
  • Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
  • ES 和Kibana-v2 带用户登录验证
  • CodeIgniter如何手动将模型连接到数据库
  • 商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)
  • AI赋能电商:构建高效、智能化的新零售生态
  • 【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】
  • 虚拟机上搭建达梦DSC简略步骤
  • Python和R荧光分光光度法
  • 电子学习中的关键游戏化元素
  • 算法日记 33 day 动态规划(打家劫舍,股票买卖)
  • JavaScript的let、var、const
  • C语言-数学基础问题
  • 解决单元测试时找不到类名
  • 从零开始-VitePress 构建个人博客上传GitHub自动构建访问
  • 【案例学习】如何使用Minitab实现包装过程的自动化和改进
  • 【ArcGISPro】使用AI提取要素-土地分类(sentinel2)
  • 深度解析:Nginx模块架构与工作机制的奥秘
  • 分布式kettle调度平台v6.4.0新功能介绍