Maven scope参数详解

Maven scope 参数详解

今天在做小项目的时候遇到这个参数,之前没见过,可能也是因为学的时候学的半吊子;在老师的提醒下去查了查,总结如下。

Maven中的scope参数用于定义依赖项的可见性和使用范围。不同的scope决定了依赖项在构建生命周期的不同阶段是否被编译、测试、打包或运行。

以下是各个scope的详细说明:


1. compile
  • 适用场景:默认作用域,用于项目的核心依赖。
  • 说明 :所有依赖如果没有指定scope,都默认为compile
  • 特点
    • 在编译、测试、运行、打包等所有阶段都可用。
    • 自动传递给依赖它的项目。
  • 使用建议:适用于项目的主要依赖,比如核心框架(如Spring)和数据库驱动等。

2. provided
  • 适用场景:依赖在编译和测试阶段需要,但在运行时由容器或JDK提供。
  • 说明provided作用域适用于那些在容器(如Servlet容器、应用服务器)或JDK内置的库。
  • 特点
    • 编译和测试时可用,但打包时不会包含。
    • 适合需要在运行时由容器或外部环境提供的依赖。
  • 使用建议:适用于Servlet API、JSP API等容器提供的依赖项。

3. runtime
  • 适用场景:运行时需要,但编译时不需要的依赖。
  • 说明:主要适用于那些仅在运行时加载的库,比如数据库驱动。
  • 特点
    • 编译时不可用,但测试和运行时可用。
    • 主要用于运行时加载的库,而非编译时依赖。
  • 使用建议:适合仅在运行时加载的依赖,比如某些插件或运行时注入的类。

4. test
  • 适用场景:仅在测试时需要的依赖。
  • 说明test作用域的依赖只在测试编译和测试运行时可用。
  • 特点
    • 只在测试编译和测试运行阶段可用,不会包含在构建产物中。
    • 主要用于单元测试和集成测试中的依赖。
  • 使用建议:适合JUnit、Mockito等测试框架。

5. system
  • 适用场景:需要本地指定依赖的路径,主要用于一些本地不可变的系统库。
  • 说明 :类似provided,但依赖必须手动指定本地路径。
  • 特点
    • 不会从Maven仓库中下载依赖,依赖路径需在本地手动指定。
    • 不会传递给依赖它的项目。
  • 使用建议:尽量避免使用,除非必须指定系统级别的依赖文件(如一些特殊的硬件驱动或本地文件)。

6. import(仅用于dependencyManagement
  • 适用场景:用于导入一个外部的依赖管理文件。
  • 说明import作用域仅适用于dependencyManagement部分,用于将外部POM中的依赖管理内容导入到当前项目中。
  • 特点
    • 仅能在dependencyManagement中使用。
    • 导入的内容会覆盖当前POM文件中已有的依赖管理配置。
  • 使用建议:用于聚合POM的依赖管理或引入依赖版本统一管理。

Maven scope 参数汇总表格

Scope 编译可见 测试可见 运行可见 打包可见 传递性 使用场景
compile ✔️ ✔️ ✔️ ✔️ ✔️ 默认范围,适用于所有构建阶段的核心依赖。
provided ✔️ ✔️ 依赖在编译和测试阶段需要,但运行时由容器或JDK提供。
runtime ✔️ ✔️ ✔️ ✔️ 运行时需要,但编译时不需要的依赖,如数据库驱动。
test ✔️ 仅在测试阶段使用的依赖,如JUnit、Mockito等测试框架。
system ✔️ ✔️ 需手动指定本地路径的系统级别依赖,通常用于特定的本地文件。
import N/A N/A N/A N/A N/A 仅适用于dependencyManagement,用于导入依赖管理文件。
相关推荐
Boilermaker19926 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维6 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_997 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子7 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34167 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
恋爱绝缘体17 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wszy18098 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
wszy18098 小时前
顶部标题栏的设计与实现:让用户知道自己在哪
java·python·react native·harmonyos
程序员小假9 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
资生算法程序员_畅想家_剑魔9 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin