依赖范围(Dependency Scope)用于控制依赖项在编译、测试、运行等不同阶段的使用范围。
Maven定义了以下几种依赖范围:
- compile(编译范围):默认的依赖范围,表示该依赖项在编译、测试和运行阶段都需要使用。
- provided(已提供范围):表示该依赖项在编译和测试阶段需要使用,但在运行时由其他外部系统或环境提供。
- runtime(运行时范围):表示该依赖项在测试和运行阶段需要使用,但在编译阶段不需要。
- test(测试范围):表示该依赖项仅在测试阶段使用,不会被打包到最终的应用程序中。
- system(系统范围):与provided类似,但需要明确指定该依赖项所在的系统路径。
① 依赖范围 provided 使用示例如下:
<project> <groupId>com.example</groupId> <artifactId>my-webapp</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies> </project>
在开发 Web 应用时,通常会依赖于 Servlet API 和 JSP API,但这些 API 库已经被 Web 容器(如 Tomcat 或 Jetty)所提供。这时,我们可以将这些依赖项的范围设置为 provided,告诉 Maven 不要将它们打包到最终的 jar包中。
在上面的示例中,我们将 Servlet API 的版本号设置为 4.0.1,并将其范围设置为 provided。当我们构建项目时,Maven 会将这个依赖项排除在最终的 jar包之外,因为这个库已经由 Web 容器提供了。这样一来,我们就可以在开发和测试阶段使用 Servlet API 的类和方法,而在部署到生产环境时,我们可以确保这些类和方法已经存在于 Web 容器中,无需再将它们打包到 jar包中。
② 依赖范围system使用示例如下:
<dependency> <groupId>com.hisape</groupId> <artifactId>sapjco</artifactId> <version>2.1.10</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/sapjco.jar</systemPath> </dependency>
<systemPath></systemPath> - 使用此标签指定该依赖项所在的系统路径
${project.basedir} - 获取项目根路径