Maven 中scope 的provided、compile、runtime、test、system 含义

在 Maven 中,<scope> 定义了依赖的可见性和生命周期。不同的 scope 值指示 Maven 在编译、测试和运行时如何处理这些依赖。以下是 Maven 中的几种常用依赖范围及其详细说明:

1. <scope>provided</scope>

  • 含义provided 范围表示该依赖在编译时可用,但在运行时并不需要包含在最终的构建产物(如 JAR 或 WAR 文件)中。
  • 使用场景
    • 该依赖通常由运行环境提供,例如应用服务器(如 Tomcat、Jetty)会提供 Servlet API 和 JSP API。
  • 特点
    • 编译时可用,但打包时不会被包含。
    • 在 WAR 文件中,依赖的库已经由应用服务器提供。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

2. <scope>compile</scope>

  • 含义compile 是默认的范围,表示该依赖在所有阶段(编译、测试、运行)都可用。
  • 使用场景
    • 常用于项目中的核心库和功能,例如第三方库或框架。
  • 特点
    • 既可以在编译时使用,也可以在测试和运行时使用。
    • 包含在最终构建产物中。
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

3. <scope>runtime</scope>

  • 含义runtime 范围表示该依赖在运行时可用,但在编译时不可用。
  • 使用场景
    • 通常用于那些编译时不需要、但在运行时需要的库,比如 JDBC 驱动程序。
  • 特点
    • 不会在编译时加入类路径,但在执行时需要存在。
    • 包含在最终构建产物中。
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
    <scope>runtime</scope>
</dependency>

4. <scope>test</scope>

  • 含义test 范围表示该依赖仅在测试时可用,不会在编译或运行时包含在内。
  • 使用场景
    • 用于测试框架和工具,如 JUnit、Mockito 等。
  • 特点
    • 只在单元测试和集成测试中使用。
    • 不包含在最终构建产物中。
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

5. <scope>system</scope>

  • 含义system 范围用于指定系统范围的依赖,通常需要手动指定依赖的路径。
  • 使用场景
    • 适用于那些不能从 Maven 仓库获取的 JAR 文件,通常是本地文件或者不在中央仓库的库。
  • 特点
    • 需要提供 systemPath 来明确指定该依赖的路径。
    • 不应该经常使用,因为直接依赖于文件系统可能会破坏构建的可移植性。
    • 不应与 Maven 的仓库系统配合使用。
<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-local-library</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/my-local-library.jar</systemPath>
</dependency>

总结

  • provided: 编译时可用,运行时由环境提供,不包含在构建产物中。
  • compile: 默认范围,编译、测试、运行时均可用,包含在构建产物中。
  • runtime: 编译时不可用,仅在运行时可用,包含在构建产物中。
  • test: 仅在测试时可用,不包含在构建产物中。
  • system: 手动指定路径的依赖,直接依赖本地文件,通常不推荐使用。
### Maven Scope 使用说明及作用范围 #### 编译范围 (Compile) 编译范围是默认的作用域。如果未指定任何作用域,则自动应用此范围。这种类型的依赖项适用于所有类路径,即用于编译、测试以及运行时环境,并会被打包到最终的制品中[^1]。 ```xml <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> ``` #### 运行时范围 (Runtime) 对于那些仅在执行期间需要但在编译过程中不需要的库来说,应该设置为`runtime`。这类依赖不会影响项目的编译过程,但是当应用程序启动或执行某些操作时需要用到这些库文件[^2]。 ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> <scope>runtime</scope> </dependency> ``` #### 提供者范围 (Provided) 一些资源可能由JDK或其他框架提供给容器中的Web应用程序使用。因此,在本地开发环境中确实存在这样的依赖关系,但是在部署之后就不必再包含进来。此时可以将其定义成`provided`类型[^4]。 ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> ``` #### 测试范围 (Test) 只有在测试阶段才需要用到的一些特殊工具或者模拟数据源等组件应当被标记为`test`级别。这意味着它们只会在构建周期内的单元测试部分起效,而不会随同产品一起发布出去。 ```xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> ``` #### 系统范围 (System) 很少情况下才会用到这个选项,它允许开发者通过绝对路径来引用特定版本的jar包而不是从远程仓库下载最新版次。不过官方并不推荐这样做因为这违背了Maven的核心理念之一——可重复性和跨平台兼容性。 ```xml <dependency> <groupId>com.example</groupId> <artifactId>example-library</artifactId> <version>1.0-SNAPSHOT</version> <scope>system</scope> <systemPath>${project.basedir}/libs/example-library.jar</systemPath> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值