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

Maven构建流程详解:如何正确管理微服务间的依赖关系-当依赖的模块更新后,我应该如何重新构建主项目

文章目录

  • 一、前言
  • 二、Maven 常用命令一览
  • 三、典型场景说明
  • 四、正确的构建顺序
    • 正确做法是:
  • 五、为什么不能只在 A 里执行 `clean install`?
  • 六、进阶推荐:使用多模块项目(Multi-module Project)
  • 七、总结

一、前言

在现代 Java 开发中,Maven 是一个非常重要的项目管理工具。它不仅可以帮助我们自动下载依赖库,还能通过标准的生命周期命令(如 mvn clean install)来完成项目的编译、测试、打包和部署。

但在实际开发过程中,尤其是多个模块或微服务之间存在依赖关系时,很多人会疑惑:“当依赖的模块更新后,我应该如何重新构建主项目?”

本文将从 Maven 的基本命令讲起,结合一个典型的项目依赖场景,带你彻底理解如何正确使用 Maven 构建项目。


二、Maven 常用命令一览

命令含义
mvn clean清除之前构建产生的文件(如 target 目录)
mvn compile编译源代码
mvn test执行单元测试
mvn package将项目打包成 jar/war 文件
mvn install把当前项目安装到本地 Maven 仓库,供其他项目引用
mvn deploy部署到远程仓库(如 Nexus)

三、典型场景说明

假设你有两个项目:

  • 项目 A:Spring Boot 微服务
  • 项目 B:一个普通的 Maven 工程(比如是一个通用工具类库)

并且,A 引用了 B,即在 A 的 pom.xml 中有如下依赖声明:

<dependency><groupId>com.example</groupId><artifactId>project-b</artifactId><version>1.0.0</version>
</dependency>

那么问题来了:

如果 B 更新了,应该是在 A 这里执行 mvn clean install,还是先在 B 这里执行 install,再在 A 这里执行 package


四、正确的构建顺序

正确做法是:

  1. 先去 B 的目录下执行:
mvn clean install

这一步的作用是把新版本的 B 安装到本地仓库(.m2/repository),这样 A 在构建时才能引用到最新的 B。

  1. 再去 A 的目录下执行:
mvn clean package

或者也可以使用:

mvn clean install

如果你也想把 A 安装到本地仓库的话。


五、为什么不能只在 A 里执行 clean install

因为 Maven 默认是从本地仓库中查找依赖。如果 B 没有重新安装到仓库中,A 构建的时候只会使用旧版本的 B。

所以你必须先更新 B 到仓库,再让 A 去拉取这个新的 B 来构建。


六、进阶推荐:使用多模块项目(Multi-module Project)

如果你经常需要同时开发 A 和 B,并且 A 依赖 B,建议将它们整合为一个 Maven 多模块项目(Parent + Submodules)

结构如下:

parent/
├── pom.xml
├── module-b/       # 即原来的 B
│   └── pom.xml
└── module-a/       # 即原来的 A└── pom.xml

然后只需在父级目录执行一次:

mvn clean install

Maven 会自动按照依赖顺序构建 B 和 A,确保 A 使用的是最新的 B。


七、总结

场景推荐操作
修改了 B,想让 A 使用最新版mvn clean install B,再 mvn clean packageinstall A
A 和 B 是父子模块在父级目录执行 mvn clean install
想清除所有历史构建加上 clean 是个好习惯
http://www.xdnf.cn/news/6124.html

相关文章:

  • D. Eating【Codeforces Round 1005 (Div. 2)】
  • Spring 中常见的属性注入方式(XML配置文件)
  • 单调栈简单习题分析
  • Web安全核心内容与常见漏洞总结
  • EasyConnect卸载大汇总
  • vulnhub靶场——secarmy
  • 动态多因子策略
  • RDD的自定义分区器
  • stm32 ADC单通道转换
  • 反射, 注解, 动态代理
  • 【PSINS工具箱】基于工具箱的单独GNSS导航、单独INS导航、两者结合组合导航,三种导航的对比程序。附完整的代码
  • 一文理解扩散模型(生成式AI模型)(2)
  • 使用 Docker Desktop 安装 Neo4j 知识图谱
  • VastBase的日常操作记录
  • Qt功能区:简介与安装
  • JS中本地存储(LocalStorage)和会话存储(sessionStorage)的使用和区别
  • vscode - 笔记
  • Deep Learning(手写字识别 - CNN)
  • Python算法思想
  • 企业级IP代理解决方案:负载均衡与API接口集成实践
  • 【导航信号模拟器】【MATLAB APP】MATLAB AppDesigner基本使用教程
  • DA14531如何在固件中生成与时间相关的mac和版本号
  • react+html-docx-js将页面导出为docx
  • 没经过我同意,flink window就把数据存到state里的了?
  • Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
  • 命令行快速上传文件到SFTP服务器(附参考示例)
  • 灰度图像和RGB图像在数据大小和编码处理方式差别
  • lanqiaoOJ 652:一步之遥 ← 扩展欧几里得定理
  • ESP32-S3R8 使能PSRAM内存
  • 【嵌入式笔记】Modbus TCP