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

news/2024/11/27 3:45:43/

文章目录

  • 一、前言
  • 二、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.ppmy.cn/news/1550229.html

相关文章

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 归并排序&#xff08;Merge Sort&#xff09;5. 快速排序&#xff08;Quick Sort&#xff09;6. 堆排序&…

PyTorch2

Tensor的常见操作&#xff1a; 获取元素值&#xff1a; 注意&#xff1a; 和Tensor的维度没有关系&#xff0c;都可以取出来&#xff01; 如果有多个元素则报错&#xff1b; import torch def test002():data torch.tensor([18])print(data.item())pass if __name__ &qu…

【高阶数据结构】图论

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是图&#xff0c;并能掌握深度优先遍历和广度优先遍历。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持…

单片机结合OpenCV

目录 一、引言 二、单片机结合 OpenCV 的优势 1. 图像识别与处理 2. 目标检测 3. 用户界面开发 4. Linux 在嵌入式系统中的作用 5. 多线程优势 6. 网络编程作用 7. 文件编程功能 三、OpenCV 在单片机上的实现难点 1. 处理能力限制 2. 通信与优化挑战 四、单片机如…

《基于FPGA的便携式PWM方波信号发生器》论文分析(二)——方波信号产生

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器&#xff0c;旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…

xtu oj Estrella‘s Chocolate

样例输入 2 5 2 5 3 2 4 1 5 3 5 3 2 4 1样例输出 8 5 解题思路&#xff1a;二分法&#xff0c;emm……&#xff0c;感觉挺难想到的。 问题简化 给定一个数组&#xff0c;和一个值k&#xff0c;数组分成k段。要求这k段子段和最大值最小。求出这个值。 1、求出数组中的最大…

裸金属服务器能够帮助企业解决哪些问题?

随着网络科技的快速发展&#xff0c;企业业务也在不断的进行扩张和复杂化&#xff0c;传统的服务已经无法满足企业对于高性能和高稳定性的需求&#xff0c;而裸金属服务器则能够帮助企业来解决这一问题&#xff0c;下面我们就来具体看一下吧&#xff01; 裸金属服务器能够允许应…

组合模式和适配器模式的区别

组合模式&#xff08;Composite Pattern&#xff09;和适配器模式&#xff08;Adapter Pattern&#xff09;都是结构型设计模式&#xff0c;它们解决的问题不同&#xff0c;应用场景也不一样。下面我来对比一下这两种模式的区别&#xff1a; 1. 目标和用途 组合模式&#xff0…