提供的scope版本如何在mavan中工作



我知道当提供的范围定义为任何maven依赖项时,它将由web服务器或运行时环境提供。但不确定版本在此处有何帮助。

以为例

<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.4</version>
<scope>provided</scope>
</dependency>

在编译时,它将使用eclipselink 2.6.4版本,但在运行时,它会是什么?它是在捆绑依赖关系时完全取决于依赖关系的提供者,还是将取决于任何其他因素?

如果它完全取决于提供者,那么在所提供的范围内定义版本的目的是什么?或者,在定义提供的范围版本时,我们应该了解web服务器捆绑包版本?

版本是让Maven知道在打包WAR/JAR/EAR等过程中编译代码时应该使用哪个版本的依赖项。

提供的作用域是让Maven知道是否需要将此依赖项包含到WAR/JAR/EAR中。如果提供了作用域,则不包括。否则,包括它。

Maven将不知道运行时环境(即应用程序服务器(中依赖项的版本。开发人员有责任手动将pom.xml中指定的版本与运行时环境的依赖项的版本相匹配。否则,您可能会遇到这样的情况:应用程序实际上可以在运行时环境中运行,但由于在pom.xml中指定了旧版本,导致您无法打包应用程序,因为旧版本不包含新版本中引入的新功能类。

来自官方文档:

这很像compile(编译依赖项在项目的所有类路径中都可用。(,但表示您希望JDK或容器在运行时提供依赖项。例如,当为Java Enterprise Edition构建web应用程序时,您需要将对Servlet API和相关Java EE API的依赖设置为所提供的范围,因为web容器提供了这些类。具有此作用域的依赖项被添加到用于编译和测试的类路径中,但不添加到运行时类路径中。它不可传递。

您必须指定一个版本,以便在编译时Maven知道要引入和编译(以及运行测试(库的哪个版本。但在那之后,依赖关系就不再使用了。假设运行时环境将使该依赖项在类路径上可用。

您必须知道您的运行时环境将提供什么版本,并且您希望针对同一版本进行编译。如果不这样做,应用程序可能会出现意外行为,甚至会因运行时异常而崩溃。

最新更新