18

在 pom.xml 中,我们将在依赖项中提供编译时和运行时作为范围?那有什么意义呢?请提供一些适用的例子来理解这一点。

4

2 回答 2

45

以下摘自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 会传递地(在同一范围内)包含 和 依赖项compileruntime

ps正如kostja提到的,还有provided范围

假如

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

provided和之间的区别基本上compileprovided依赖是不传递的。

于 2013-10-23T12:36:53.863 回答
1

假设您正在将应用程序部署到符合 Java EE 的服务器。该服务器提供了所有实现 Java EE 标准的库,因此您无需将它们与您的应用程序一起部署。

在开发过程中,您将需要具有编译时范围的 Java EE 库,因为您需要编译这些类。

然而,在运行时,依赖项由应用程序服务器提供。对于这种情况,Maven 使用“提供的”范围。

于 2013-10-23T11:56:29.807 回答