Maven编译和运行时作用域的区别

jobtbby3  于 2023-11-17  发布在  Maven
关注(0)|答案(2)|浏览(130)

在Maven项目的pom.xml中,我们可以在依赖项中提供compileruntime作为作用域。这有什么意义?请提供一些适用的例子来理解这一点。

k4emjkb1

k4emjkb11#

以下内容摘自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依赖项。
p.s.正如kostja提到的,还有provided范围

提供

这很像编译,但表示您希望JDK或容器在运行时提供依赖项。例如,为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API上的依赖项设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。
基本上,providedcompile之间的区别在于provided依赖项是不可传递的。

bxfogqkk

bxfogqkk2#

假设您正在将应用程序部署到一个Java EE兼容的服务器上,该服务器提供了实现Java EE标准的所有库,因此您不需要将它们与应用程序一起部署。
在开发过程中,您将需要具有编译时作用域的Java EE库,因为您需要编译类。
但是在运行时,依赖项是由应用服务器提供的。Maven在这种情况下使用“提供”作用域。

相关问题