在 pom.xml 中,我们将在依赖项中提供编译时和运行时作为范围?那有什么意义呢?请提供一些适用的例子来理解这一点。
2 回答
以下摘自maven文档
编译
这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖关系会传播到依赖项目。
运行
此范围表示依赖项不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,但不在编译类路径中。
例如,如果我们的 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
将不可用 - 如果偶然我从commons-logging
我的项目的一个类中直接引用了一个类,那么构建将失败。
然而,在运行时或测试编译和执行期间,commons-logging 中的类将位于类路径上,因此可以使用(即通过来自 的类commons-logging-api
,或直接在项目的测试中使用)。
当您的项目在另一个项目中被引用为依赖项时,Maven 会传递地(在同一范围内)包含 和 依赖项compile
。runtime
ps正如kostja提到的,还有provided
范围
假如
这很像 compile,但表明您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java 企业版构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。
provided
和之间的区别基本上compile
是provided
依赖是不传递的。
假设您正在将应用程序部署到符合 Java EE 的服务器。该服务器提供了所有实现 Java EE 标准的库,因此您无需将它们与您的应用程序一起部署。
在开发过程中,您将需要具有编译时范围的 Java EE 库,因为您需要编译这些类。
然而,在运行时,依赖项由应用程序服务器提供。对于这种情况,Maven 使用“提供的”范围。