在Maven中,“provided”是一个常用的依赖范围,它表示某个依赖项在编译和测试阶段是必需的,但在运行时则由外部环境提供,不需要包含在最终的项目包中。下面是对Maven scope “provided”的详细解释:
- 编译和测试阶段可用:当一个依赖项的scope被设置为“provided”时,这意味着在编译项目代码和执行测试时,这个依赖项是可用的。这意味着你可以在代码中自由地使用这个依赖提供的类和方法。
- 运行时不包括:尽管在编译和测试阶段这个依赖项是可用的,但在打包最终的项目包(如WAR或JAR)时,它不会被包含在其中。这是因为通常“provided”依赖由运行时环境(如应用服务器或JDK)提供。
- 与容器集成:在许多情况下,“provided”范围的依赖项是由应用运行的容器(如Web服务器或应用服务器)提供的。这意味着当应用程序部署到容器中时,这些依赖项将由容器自动提供,而不需要在应用程序的部署包中包含它们。
- 特定用途的依赖项:一些工具和库,如Lombok,通常被设置为“provided”范围,因为它们主要用于编译时提供功能(如自动生成代码),而在运行时则不再需要。
- 与“compile”范围的差异:“provided”范围与“compile”范围的主要区别在于运行时行为。当一个依赖项的scope被设置为“compile”时,它将在编译和运行时都可用,并包含在最终的项目包中。而“provided”范围的依赖项仅在编译和测试阶段需要,运行时不包括。
<scope> 被设置为 provided 是因为它主要是一个编译时工具,用来生成样板代码,如 getter、setter 方法等。一旦代码被编译,Lombok 的工作就完成了,运行时不再需要它。因此,在打包应用时,不需要将其包含在其中,因为它在运行时不是必需的。这就是为什么通常将其 scope 设置为 provided。
在运行时勾选↓↓↓↓↓↓
类似的,还有其他几种依赖范围:
- compile(默认):这是默认的依赖范围,表示该依赖在编译、运行时都可用,并且会被包含在项目的最终包中。
- runtime:与“compile”范围类似,但在运行时可用,但不会在编译时包含依赖。这意味着编译时可以使用该依赖提供的类和方法,但在运行时需要确保该依赖可用。
- test:仅在测试阶段可用,用于包含测试所需的依赖。这些依赖项不会包含在最终的项目包中。
- system:与“provided”范围类似,表示该依赖在编译和测试阶段是必需的,但在运行时需要由外部系统提供。与“provided”不同的是,“system”范围的依赖项需要显式指定系统的路径。
- optional:当一个依赖项的scope被设置为“optional”时,表示该依赖不是必需的,可以在使用时忽略。这对于那些可选的组件或与其他依赖无关的组件非常有用。