乐闻世界logo
搜索文章和话题

Maven 作用域编译和提供 JAR 打包之间的区别是什么

4 个月前提问
3 个月前修改
浏览次数16

1个答案

1

在 Maven 中,依赖管理是一个核心功能,而作用域(Scope)是定义依赖与项目交互方式的关键属性。其中,“编译”(compile)作用域和“提供”(provided)作用域是两种常见的依赖配置方式,它们在 JAR 打包过程中表现出明显的不同行为。

编译作用域(compile)

定义: 编译作用域是 Maven 依赖的默认作用域。这意味着如果你没有明确指定一个依赖的作用域,它将默认为编译作用域。

特点:

  • 依赖在所有的类路径中都有效,包括编译路径、测试路径和运行时路径。
  • 当项目被打包成 JAR(或其他格式)文件时,这些依赖也会被包含在内。

例子: 如果你的项目依赖于 commons-lang3 这个库,你通常需要在编译时、测试时和运行时都能够使用它的功能。因此,你会将它设置为编译作用域:

xml
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> <scope>compile</scope> </dependency>

提供作用域(provided)

定义: 提供作用域用于标记那些在编译和测试阶段需要,但在运行时不需要的依赖,因为这些依赖会由 JDK 或者容器在运行时提供。

特点:

  • 依赖在编译时和测试时有效,但不会包括在打包的 JAR 文件中。
  • 这种作用域通常用于依赖于容器运行时或JDK自带的库(例如,Servlet API)。

例子: 在开发一个 web 应用时,你可能会用到 servlet-api 库进行编译和测试,但实际运行时,Servlet 容器(如 Tomcat)已经提供了这个库:

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

总结

总的来说,编译作用域适用于那些项目运行时必须依赖的库,而提供作用域适用于那些在运行时由环境(如容器或JDK)提供的库。正确使用这两种作用域不仅可以确保项目的可构建性和可测试性,还能有效控制最终部署包的大小,确保不会将不必要的库包含在内。这在维护大型项目或优化应用部署时尤为重要。

2024年8月15日 17:52 回复

你的答案