Maven Jar 加载原则优先级梳理

在 Maven 项目中,加载 JAR 包的优先级和顺序是一个重要的概念。理解这些原则有助于解决依赖冲突和确保项目的正确构建。以下是 Maven 加载 JAR 包的优先级原则:

  1. 直接依赖(Direct Dependencies):

    • 首先,Maven 会加载直接声明在 pom.xml 文件中的依赖项。这些依赖项通常位于 <dependencies> 标签内。
  2. 传递依赖(Transitive Dependencies):

    • 对于每个直接依赖,Maven 还会加载其传递依赖。传递依赖是指一个库所依赖的其他库。例如,如果 A 依赖于 B,而 B 又依赖于 C,那么 C 就是 A 的传递依赖。
  3. 依赖范围(Dependency Scopes):

    • Maven 会根据依赖的范围来决定是否加载某个依赖。常见的依赖范围包括:
      • compile: 默认范围,适用于所有阶段(编译、测试、运行)。
      • provided: 只在编译和测试时可用,运行时由容器提供。
      • runtime: 只在运行和测试时可用,编译时不可用。
      • test: 只在测试时可用,编译和运行时不可用。
      • system: 类似于 provided,但需要显式指定路径。
  4. 版本管理(Version Management):

    • 如果多个依赖项引用了同一个库的不同版本,Maven 将根据以下规则选择版本:
      • 最短路径优先: Maven 会选择距离根节点最近的依赖版本。
      • 第一声明优先: 如果两个依赖项具有相同的路径长度,Maven 会选择第一个声明的版本。
  5. 排除依赖(Exclusions):

    • 可以通过 <exclusions> 标签来排除某些传递依赖。例如:

      <dependency> <groupId>com.example</groupId> <artifactId>example-dependency</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>org.unwanted</groupId> <artifactId>unwanted-library</artifactId> </exclusion> </exclusions> </dependency>

  6. 插件依赖(Plugin Dependencies):

    • Maven 插件本身也有自己的依赖,这些依赖会在插件执行时被加载。
  7. 父 POM 和继承(Parent POM and Inheritance):

    • 如果项目继承了父 POM,父 POM 中的依赖也会被加载。子模块可以覆盖或添加新的依赖。
  8. 仓库(Repositories):

    • Maven 会从本地仓库、远程仓库以及中央仓库中查找并下载所需的依赖。
  9. Profiles(配置文件):

    • 通过激活不同的 Maven 配置文件,可以改变依赖的加载方式。例如,开发环境和生产环境可以使用不同的依赖配置。
相关推荐
jinanwuhuaguo几秒前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup33 分钟前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952361 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.1 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19431 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12211 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px1 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS1 小时前
SpringBoot中自定义Starter
java·spring boot·后端
苍煜2 小时前
慢SQL优化实战教学
java·数据库·sql
AI进化营-智能译站2 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai