跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java Web 后端进阶:Maven 高级特性与工程实践

Maven 高级特性涵盖分模块设计、继承聚合及私服管理。通过父工程统一管理依赖版本,利用聚合实现多模块一键构建。私服仓库区分发布版与快照版,解决团队资源同步问题。掌握这些核心机制能显著提升企业级项目的可维护性与构建效率。

PentesterX发布于 2026/4/10更新于 2026/5/2212 浏览

Maven 是一款构建和管理 Java 项目的核心工具。

1 分模块设计与开发

文章配图

文章配图

分模块设计的核心在于将项目按功能或结构拆分为若干子模块,这不仅能方便后续的管理维护和拓展,还能促进模块间的相互调用与资源共享。

常见的拆分策略有三种:

  1. 按功能模块拆分:例如公共组件、商品模块、搜索模块、购物车模块、订单模块等。
  2. 按层拆分:例如公共组件、实体类、控制层、业务层、数据访问层。
  3. 混合拆分:结合功能模块与层级进行划分。

文章配图

例如:

文章配图

这里需要特别强调:分模块开发必须先针对模块功能进行设计,再进行编码。切忌先完成整个工程开发后再强行拆分,那样会留下大量耦合问题。

2 继承与聚合

在案例项目分模块开发后,我们常会发现 tlias-pojo、tlias-utils、tlias-web-management 等多个模块都引入了 lombok 依赖。如果在每个模块中单独配置,一旦需要修改版本,就得逐个文件修改,非常繁琐。这时,Maven 的继承机制就能派上用场。

2.1 继承(简化依赖配置、统一管理依赖版本)

2.1.1 继承关系 <parent>

创建一个父工程 tlias-parent,让上述三个模块都继承它。然后将各模块共有的依赖提取到父工程中统一配置。

文章配图

这样做的好处显而易见:简化依赖配置,统一管理依赖。

<parent>
    ...
    ...
    ...
    ....

<groupId>
</groupId>
<artifactId>
</artifactId>
<version>
</version>
<relativePath>
</relativePath>
</parent>

需要注意的是,Maven 不支持多继承,一个 Maven 项目只能继承一个父工程。如果 tlias-web-management 已经继承了 spring-boot-starter-parent,就无法再直接继承自定义的 tlias-parent。

解决思路是建立层级链:子模块继承 tlias-parent,而 tlias-parent 再继承 spring-boot-starter-parent。

文章配图

Maven 打包方式说明:

  • jar:普通模块打包,Spring Boot 项目基本都是 jar 包(内嵌 Tomcat 运行)。
  • war:普通 Web 程序打包,需部署在外部 Tomcat 服务器中运行。
  • pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理。

创建 Maven 模块 tlias-parent 作为父工程时,务必设置打包方式为 pom(默认为 jar)。

Maven 继承关系的实现步骤:

  1. 在父工程中配置各个工程的共有依赖。 文章配图

  2. 在子工程中配置继承关系。 注意以下几点:

    • 配置了继承关系后,子工程坐标中的 groupId 可以省略,因为会自动继承父工程的。
    • relativePath 指定父工程 pom 文件的相对位置(默认指向当前目录下的 parent pom)。如果不指定,Maven 会从本地仓库或远程仓库查找。其中 ../ 代表上一级目录。
    • 若父子工程配置了同一个依赖的不同版本,以子工程的为准。

    文章配图

实际项目中,工程结构通常如下:tlias-parent 下包含 tlias-pojo、tlias-utils、tlias-web-management。在企业开发中,通常是先设计好模块,再创建父工程并将子模块放入其中,这样层级结构更清晰。

2.1.2 版本锁定 <dependencyManagement> & <properties>

痛点:如果项目拆分的模块比较多,每次更换依赖版本,都需要找到每一个模块逐一修改,很容易遗漏。

解决方案:利用 Maven 的版本锁定功能。

在父工程的 pom 文件中通过 <dependencyManagement> 来统一管理依赖版本。这里有一个关键点:父工程配置的 <dependencyManagement> 只统一管理依赖版本,并不会直接将依赖引入进来,这与 <dependencies> 不同。

<!--统一管理依赖版本-->
<dependencyManagement>
    <dependencies>
        <!--JWT 令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在子工程中,如果要使用这个依赖,仍需引入,但此时无需指定 <version> 版本号,由父工程统一管理。变更依赖版本时,只需在父工程中统一变更即可。

<dependencies>
    <!--JWT 令牌-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
</dependencies>

此外,还可以通过自定义属性及属性引用的形式,在父工程中将依赖的版本号进行集中管理维护。

文章配图

文章配图

文章配图

常见问题:<dependencyManagement> 与 <dependencies> 的区别?

  • <dependencies> 是直接依赖,在父工程配置后,子工程会直接继承下来。
  • <dependencyManagement> 是统一管理依赖版本,不会直接依赖,子工程还需引入所需依赖(无需指定版本)。

2.2 聚合 <modules>(快速构建项目)

当项目被拆分为多个模块,且模块间依赖关系错综复杂时,手动构建会变得非常麻烦。

例如,tlias-web-management 依赖了 tlias-pojo 和 tlias-utils。在进行 tlias-web-management 打包时,Maven 会去本地仓库查找这些依赖。如果本地仓库没有安装过这些模块,构建就会失败。

这意味着我们需要分别对 tlias-parent、tlias-pojo、tlias-utils 执行 install 生命周期安装到本地仓库,最后才能对 tlias-web-management 执行 package。对于大型项目,这种操作极其繁琐。

Maven 的聚合功能正是为了解决这个问题。通过聚合,可以实现项目的一键构建(清理、编译、测试、打包、安装等)。

  • 聚合:将多个模块组织成一个整体,同时进行项目的构建。
  • 聚合工程:一个不具有业务功能的'空'工程(有且仅有一个 pom 文件)。通常继承关系中的父工程与聚合关系中的聚合工程是同一个。
  • 作用:快速构建项目,无需根据依赖关系手动构建,直接在聚合工程上构建即可。
<!--聚合哪些模块-->
<modules>
    <module>../tlias-pojo</module>
    <module>../tlias-utils</module>
    <module>../tlias-web-management</module>
</modules>

配置完成后,IDEA 的 Maven 面板也会发生变化,只剩下 tlias-parent 这个父工程可见。

文章配图

此时,我们要进行编译、打包、安装操作,就无需在每一个模块上操作了。只需要在聚合工程上,统一进行操作就可以了。

文章配图

Maven 中继承与聚合的联系与区别?

  • 联系:两者都属于设计型模块,打包方式都为 pom,常将两种关系制作到同一个 pom 文件中。
  • 区别:继承用于简化依赖配置、统一管理依赖版本,是在子工程中配置;聚合用于快速构建项目,是在父工程(聚合工程)中配置聚合的模块。

3 私服

文章配图

私服是一种特殊的远程仓库,架设在局域网内,用来代理位于外部的中央仓库。它的核心作用是解决团队内部的资源共享与资源同步问题。

依赖查找顺序:本地仓库 -> 私服仓库 -> 中央仓库。

注意事项:在企业项目开发中,一个项目或公司通常只需要一台私服即可(无需自己搭建,学会使用即可)。

私服仓库说明:

  • RELEASE:存储自己开发的 RELEASE 发布版本的资源。
  • SNAPSHOT:存储自己开发的 SNAPSHOT 发布版本的资源。
  • Central:存储的是从中央仓库下载下来的依赖。

项目版本说明:

  • RELEASE(发布版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的 RELEASE 仓库中。
  • SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的 SNAPSHOT 仓库中。

目录

  1. 1 分模块设计与开发
  2. 2 继承与聚合
  3. 2.1 继承(简化依赖配置、统一管理依赖版本)
  4. 2.1.1 继承关系 <parent>
  5. 2.1.2 版本锁定 <dependencyManagement> & <properties>
  6. 2.2 聚合 <modules>(快速构建项目)
  7. 3 私服
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VS Code 中实现 Go 语言自动导包配置指南
  • 基于 YOLOv5 的深度学习火焰检测与识别系统
  • AI 辅助游戏开发:基于 DeepSeek 构建贪吃蛇游戏
  • Whisper 语音识别完整指南:从入门到应用
  • Python 属性描述符:从原理到 ORM 实践
  • HTML 基础标签与简易网页制作实战
  • 基于 SpringBoot 的农产品销存一体化系统设计与实现
  • 大模型的 6 项核心技术:Transformer、预训练与 RLHF 等
  • OpenClaw 跨平台 AI 助手完全使用指南:从入门到精通
  • Verilog 零基础入门:语法、仿真与 FPGA 实战
  • 字节跳动开源 Seed-OSS-36B:512K 上下文推理新突破
  • FastAPI:Python 高性能 Web 框架的优雅之选
  • SHA-256 哈希破解工具技术解析
  • Java 对象更新时避免空字段覆盖的几种拷贝方案
  • C语言常用算法与数据结构基础
  • MC.JS WEBMC1.8 实战:构建在线多人沙盒游戏
  • WorkBuddy 接入 QQ 机器人配置指南
  • 国内升级 GitHub Copilot 专业版的有效支付方案
  • SpringBoot 手动开启数据库事务的几种实现方式
  • Linux 进程信号的产生机制详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online