maven编译时和运行时之间的区别

Sur*_*san 15 maven

在pom.xml中,我们将提供编译时和运行时作为依赖的范围?什么是重要的?请提供一些适用的例子来理解这一点.

DB5*_*DB5 26

以下内容取自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>
Run Code Online (Sandbox Code Playgroud)

然后,commons-logging-api在我的模块编译期间,类将在类路径上,而来自的类commons-logging将无法使用 - 如果偶然我commons-logging在我的一个项目的类中直接引用了类,那么构建将失败.

但是,在运行时或测试编译和执行期间,commons-logging中的类将位于类路径上,因此可以使用(即通过类commons-logging-api或来自项目测试的类).

双方compileruntime在您的项目在其他项目的依赖引用的依赖是及物动词包括(在相同的范围)Maven的.

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

提供

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

基本上之间的差provided并且compileprovided依赖不会被传递的.


kos*_*tja 1

想象一下,您正在将应用程序部署到兼容 Java EE 的服务器。服务器提供了实现 Java EE 标准的所有库,因此您无需将它们与应用程序一起部署。

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

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

  • 如果服务器/容器已经在运行时提供这些依赖项,那么我们将保持范围为“已提供”而不是编译。 (2认同)