若依框架中根目录与子模块 `pom.xml` 的区别

embedded/2024/10/23 10:04:40/
xmlns="http://www.w3.org/2000/svg" style="display: none;">
前言

在使用 Maven 构建的多模块项目中,比如若依(RuoYi)这样的后台管理系统,我们会遇到两种不同作用的 pom.xml 文件:位于项目根目录下的以及每个子模块下的。这两者之间存在一些关键差异,并且理解这些差异对于正确配置和管理项目至关重要。

xml_3">根目录下的 pom.xml

根目录下的 pom.xml 主要作为父 POM 文件,它承担着以下几个重要职责:

  • 依赖管理:通过 <dependencyManagement> 部分定义全局的依赖版本。这样,在所有子模块引用相同依赖时就不需要再指定版本号,从而确保整个项目的版本一致性。
  • 模块声明:利用 <modules> 标签列出所有的子模块。这样做使得 Maven 可以统一管理和构建整个多模块项目。
  • 插件管理:定义了构建过程中使用的各种插件及其版本,保证所有子模块采用相同的构建工具集。
  • 公共属性:设置一些基础属性,如 Java 版本等,方便子模块复用。
xml_11">子模块(如 ruoyi-admin)下的 pom.xml

相比之下,每个子模块内的 pom.xml 则更加专注于具体的实现细节:

  • 继承父 POM:通过 <parent> 标签来继承根目录下 pom.xml 中定义的各种配置,包括但不限于依赖版本和构建插件。
  • 特定依赖声明:即使某个依赖已经在父 POM 中被管理了,子模块仍需显式地声明它。这是因为 <dependencyManagement> 仅用于预设版本信息而不实际引入依赖;只有当子模块明确指定了一个依赖时,Maven 才会真正将其加入到项目的类路径中。
  • 模块特有配置:根据自身需求对构建过程进行额外定制,例如添加或覆盖某些特定的构建插件配置。
为什么子模块仍需声明依赖
  1. 明确性:通过在子模块中明确声明所需依赖,确保构建过程中能够准确无误地包含这些库。
  2. 选择性引入:不同的子模块可能只关心父 POM 管理的部分依赖。因此,按照实际需要引入依赖可以避免加载不必要的库,有助于保持项目的简洁性和性能。
xml__22">为什么根目录下的 pom.xml 引用了依赖,子模块下还要再次引用?

在 Maven 项目中,根目录下的 pom.xml 使用 <dependencyManagement> 来管理依赖的版本,但并不实际引入这些依赖。具体来说,<dependencyManagement> 仅仅是一个版本信息的集中管理器,它告诉 Maven 如果某个依赖在子模块中被引用时应该使用哪个版本,但它并不会将这些依赖实际添加到项目的类路径中。

为了使这些依赖真正可用,子模块必须在自己的 pom.xml 文件中通过 <dependencies> 部分显式地声明这些依赖。这种设计有以下几点好处:

  1. 灵活性:不同的子模块可以根据自己的需求选择性地引入依赖,而不是强制所有子模块都使用相同的依赖集合。
  2. 清晰性:子模块的 pom.xml 明确列出了其实际使用的依赖,使得项目结构更加清晰,便于维护。
  3. 避免冗余:如果某个子模块不需要某个依赖,就不必在该子模块中引入,从而减少了项目的复杂性和潜在的冲突。
实际示例

假设我们在若依项目中创建了一个新的业务模块 ruoyi-student。首先,在根目录的 pom.xml 中,我们通过 <dependencyManagement> 定义了 MyBatis Plus 的版本:

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.ruoyi</groupId><artifactId>ruoyi</artifactId><version>3.8.6</version><packaging>pom</packaging><properties><mybatis-plus.version>3.4.3.4</mybatis-plus.version><!-- 其他属性 --></properties><dependencyManagement><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><!-- 更多依赖 --></dependencies></dependencyManagement><modules><module>ruoyi-admin</module><module>ruoyi-student</module><!-- 其他子模块 --></modules><!-- 插件管理和其他配置 -->
</project>

然后,在 ruoyi-student 模块的 pom.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.ruoyi</groupId><artifactId>ruoyi</artifactId><version>3.8.6</version></parent><artifactId>ruoyi-student</artifactId><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!-- 其他特定于该模块的依赖 --></dependencies><!-- 模块特有配置 -->
</project>

这里并没有重复指定版本号,因为这已经由父 POM 管理好了。

结语

了解并正确应用这两种 pom.xml 的特性,可以帮助开发者更好地组织和维护复杂的多模块项目。希望这篇博客能够帮助您加深对 Maven 项目结构的认识,并为您的开发工作提供一定的指导。如果您还有更多关于若依或其他相关技术的问题,欢迎继续探讨!

总结

  • 根目录 pom.xml 负责全局配置,包括依赖版本管理、模块声明和插件管理。
  • 子模块 pom.xml 继承根目录 pom.xml 的配置,并根据自身需求声明具体依赖和特有配置。
  • 子模块需要显式声明依赖 是为了确保依赖被正确引入,并且可以根据需要选择性地引入依赖。
  • 根目录下的 pom.xml 引用了依赖,子模块下还需要再次引用 是因为 <dependencyManagement> 仅管理版本信息,不实际引入依赖,子模块需要通过 <dependencies> 显式声明依赖才能使其生效。

http://www.ppmy.cn/embedded/129789.html

相关文章

python学习-第一个小游戏(vscode环境)

学习小甲鱼的视频&#xff0c;写了一个小游戏&#xff0c;vscode环境 运行结果 源码地址&#xff1a; python小游戏-猜数字源码

Android--第一个android程序

写在前边 ※安卓开发工具常用模拟器汇总Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)_安卓模拟器-CSDN博客 ※一般游戏模拟器运行速度相对较快&#xff0c;本文选择逍遥模拟器_以下是Android Studio连接模拟器实现(先从以上博文中…

Linux中输入和输出基本过程

目录 Linux中输入和输出基本过程 文件内核级缓冲区 何为重定向 子进程与缓冲区 手撕一个简单的shell&#xff08;版本2&#xff09; 判断重定向命令与截取 执行重定向 简单实现stdio.h中的文件相关操作 FILE结构体 fopen函数 fwrite函数 fflush函数 fclose函数 Li…

TLS实验报告

Task 1: TLS Client 3.1 Task 1.a: TLS handshake &#xff1a; 修改一下配置文件handshake.py内容&#xff1a; 然后输入指令&#xff1a;./handshake.py www.baidu.com 和百度进行握手。 执行得到如下图结果&#xff1a; 针对实验手册中提出的问题&#xff0c;我们回答如…

某科技——北京——国护蓝中研判岗

文章目录 所面试的公司&#xff1a;某科技所在城市&#xff1a;北京面试职位&#xff1a;国护蓝中研判岗面试过程&#xff1a; 面试官的问题&#xff1a;1、面试官先就是很常态化的让我做了一个自我介绍2、自我介绍不错&#xff0c;听你讲熟悉TOP10漏洞&#xff0c;可以讲下自己…

快速对比:Django、Spring Boot、Node.js 和 PHP

在软件开发的世界中&#xff0c;后端技术栈的选择对项目的成败起着至关重要的作用。不同的框架和编程语言在开发效率、运行速度、并发能力和稳定性等方面各具优势。那么&#xff0c;当开发者独自承担项目时&#xff0c;如何选择合适的技术栈呢&#xff1f;本文将通过简略分析 D…

Java面试题七

一、Java中的集合框架是如何组织的&#xff1f;列举几个常用的集合类。 Java中的集合框架是一个设计用来存储和操作对象集合的统一架构。它主要由两大接口派生出来&#xff1a;Collection和Map。这两个接口及其子接口和实现类共同构成了Java集合框架的主体。 集合框架的组织结…

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…