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

Maven 依赖范围(Scope)详解

Maven 依赖范围(Scope)详解

Maven 是一个强大的项目管理工具,广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时,我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <dependencies> 部分定义这些依赖。每个依赖可以指定一个范围(scope),用来控制该依赖如何被使用以及它会在哪些类路径中可见。

1. 默认范围(compile)

这是 Maven 中默认的依赖范围,如果没有明确指定范围,默认情况下就是 compile 范围。

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version>
</dependency>

特点:

  • 编译、测试和运行时类路径都会包含该依赖。
  • 打包时也会将此依赖打包进最终的 JAR 或 WAR 文件中。

2. 运行范围(runtime)

runtime 范围用于指定那些仅在运行时需要,而在编译时不需要的依赖。例如,JDBC 驱动程序通常用这种范围来定义。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version><scope>runtime</scope>
</dependency>

特点:

  • 编译时类路径不包含此依赖。
  • 测试和运行时的类路径会包含该依赖。
  • 打包时,这些依赖会被打包进最终的 JAR 或 WAR 文件中。

3. 提供范围(provided)

provided 范围用于指定那些在编译和测试时需要,但是在运行时由容器或环境提供的依赖。例如,在使用 Servlet 容器如 Tomcat 进行开发时,Servlet API 可以用这种范围来定义。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

特点:

  • 编译和测试时类路径包含此依赖。
  • 运行时类路径不包含,假设运行环境会提供这些类。

4. 测试范围(test)

test 范围用于指定那些仅在编译和执行测试时需要的依赖。例如 JUnit 等测试框架通常用这种范围来定义。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

特点:

  • 仅编译和运行测试时类路径包含此依赖。
  • 编译和运行主程序时不包括。

5. 系统范围(system)

system 范围允许你引用一个不在 Maven 存储库中的依赖。这种依赖必须由 systemPath 元素明确指定其位置。

<dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.3</version><scope>system</scope><systemPath>${project.basedir}/lib/ojdbc6.jar</systemPath>
</dependency>

特点:

  • 类似于 provided 范围,但在编译和测试时需要指定具体的文件路径。
  • 这种依赖不在 Maven 中央仓库中查找。

6. 导入范围(import)

import 范围用于在 <dependencyManagement> 部分引用 BOM (Bill of Materials) 文件。这允许你管理整个项目的依赖版本和范围,而不必在每个子模块的 pom.xml 中重复这些信息。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.3.4.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

特点:

  • 仅在 <dependencyManagement> 中使用。
  • 可以帮助管理所有子模块的依赖。

通过合理地选择和配置 Maven 的依赖范围,可以更好地控制项目的构建过程,避免不必要的类路径污染,并确保项目能在正确的环境和条件下运行。

相关文章:

  • 写windows服务日志-.net4.5.2-定时修改数据库中某些参数
  • 批量级负载均衡(Batch-Wise Load Balance)和顺序级负载均衡(Sequence-Wise Load Balance)
  • 【如何使用solidwork编辑结构导入到simscope】
  • FastAPI中的依赖注入详解与示例
  • MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略
  • 语音合成之八-情感化语音合成的演进路线
  • HTTP header Cookie 和 Set-Cookie
  • DIFY教程第一集:安装Dify配置环境
  • 泰迪杯实战案例超深度解析:旅游景点游客流量预测与资源优化
  • 英文中日期读法
  • 记录学习记录学习《手动学习深度学习》这本书的笔记(九)
  • Python中的Walrus运算符分析
  • 第35课 常用快捷操作——用“鼠标左键”拖动图元
  • 产品经理面经(1)
  • 在winform中使用chromiumWebBrowser显示Echarts图表
  • 前端高频面试题day2
  • 大模型工程师基础之学会使用openai
  • 51单片机所有寄存器介绍
  • leetcode0103. 二叉树的锯齿形层序遍历-medium
  • JAVA手写题-精通 Java 单例模式:三种线程安全的实现方式详解
  • 从“网点适老化”到“社区嵌入式”,“金融为老上海模式”如何探索?
  • 教育强国建设基础教育综合改革试点来了!改什么?怎么改?
  • 国家核安全局局长:我国核电进入大规模建设高峰期,在建规模超其他国家总和
  • 伊朗外长: 美伊谈判进展良好,讨论了很多技术细节
  • 俄罗斯称已收复库尔斯克州,普京发表讲话
  • 习近平在中共中央政治局第二十次集体学习时强调,坚持自立自强,突出应用导向,推动人工智能健康有序发展