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、项目结构

项目结构如下:

bash 复制代码
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>标签中列出所有子模块。
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>
    <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(如果父模块不在默认位置)。
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>
    <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文件中添加以下依赖:

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}是一个很好的做法,因为它可以确保版本的一致性。

相关推荐
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
CHHYQMGDCDZu6 小时前
光伏系统参数
maven
qq_12498707538 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732069 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu12 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶12 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip13 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide14 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf14 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端