在pom.xml中,我们将提供编译时和运行时作为依赖的范围?什么是重要的?请提供一些适用的例子来理解这一点。
答案 0 :(得分:21)
编译
这是默认范围,如果未指定,则使用此范围。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
<强>运行时强>
此范围表示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。
例如,如果我们的POM中有以下两个依赖项:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1.3</version>
<scope>compile</scope> <!-- can be ommitted as it is the default -->
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
<scope>runtime</scope>
</dependency>
然后来自commons-logging-api
的类在我的模块编译期间将在类路径上,而来自commons-logging
的类将不可用 - 如果偶然我直接引用来自{{的类1}}在我的一个项目的类中,然后构建将失败。
但是在运行时或测试编译期间&amp;执行commons-logging中的类将在类路径上,因此可以使用(即来自commons-logging
的类,或直接在项目的测试中)。
当您的项目作为另一个项目中的依赖项被引用时,Maven可以传递(在同一范围内)commons-logging-api
和compile
个依赖项。
P.S。正如kostja所提到的,还有runtime
范围
<强>提供强>
这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
基本上provided
和provided
之间的差异是compile
依赖项不可传递。
答案 1 :(得分:0)
想象一下,您正在将应用程序部署到Java EE compiant服务器。服务器提供了所有实现Java EE标准的lilbraries,因此您无需在应用程序中部署它们。
在开发期间,您需要具有编译时范围的Java EE库,因为您需要编译类。
在运行时期间,依赖项由应用程序服务器提供。 Maven使用“提供”范围来处理此类情况。