pom.xml中<dependency>下的<scope>是什么?


Answers:


266

<scope>元素可以采用6个值:编译提供运行时测试系统导入

此作用域用于限制依赖项的可传递性,并且还影响用于各种构建任务的类路径。

编译

这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中均可用。此外,这些依赖项会传播到相关项目。

提供

这很像编译,但是表明您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您将对Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。该作用域仅在编译和测试类路径上可用,并且不可传递。

运行

此作用域表明依赖关系不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,但不在编译类路径中。

测试

此范围表明该依赖关系对于正常使用该应用程序不是必需的,并且仅在测试编译和执行阶段可用。

系统

此范围与提供的范围类似,不同之处在于您必须提供显式包含它的JAR。该工件始终可用,并且不会在存储库中查找。

进口(仅在Maven 2.0.9或更高版本中可用)

该范围仅在本节中用于pom类型的依赖项上。它指示应使用该POM部分中的依赖项替换指定的POM。由于已将它们替换,因此具有导入范围的依赖项实际上并不参与限制依赖项的可传递性。

要回答问题的第二部分:

我们如何使用它进行测试?

请注意 test范围仅允许将依赖项用于测试阶段。

阅读文档以获取全部详细信息。


因此,如果您使用“测试”,它是否最终会出现在创建的.jar中?
markthegrea

1
如果在编译和运行时需要依赖项怎么办?
Albin


12

六个依赖范围:

  • 编译:默认范围,类路径同时适用于src/mainsrc/test
  • 测试:类路径可用于src/test
  • 提供:类似于complie,但在运行时由JDK或容器提供
  • 运行时:编译不需要,仅在运行时需要
  • 系统:本地提供classpath
  • import:只能将其他POM导入<dependencyManagement/>,仅在Maven 2.0.9或更高版本中可用


4

范围标记始终用于在类路径级别限制jar的传递依赖关系和可用性。如果我们不提供任何范围,则默认范围将起作用,即Compile


11
编译意味着您需要JAR来编译和运行该应用程序。例如,对于Web应用程序,JAR将放置在WEB-INF / lib目录中。提供意味着您需要编译JAR,但是在运行时环境已经提供了JAR,因此您不需要将其与应用程序打包在一起。对于Web应用程序,这意味着JAR文件不会被放置到WEB-INF / lib目录中。对于Web应用程序,如果应用程序服务器已提供JAR(或其功能),则使用“提供”,否则使用“编译”。
Mukesh

1
请在您的答案中添加您的评论
Supun Wijerathne '18

0

如果我们不提供任何作用域,则默认作用域为compile。如果要确认,只需转到eclipse编辑器中的Effective pom选项卡,它将显示为已编译。


OP询问范围什么和什么,没有找到默认范围是什么。
Wouter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.