<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>
2条答案
按热度按时间k4emjkb11#
以下内容摘自maven文档
编译
这是默认作用域,如果未指定则使用。编译依赖项在项目的所有类路径中可用。此外,这些依赖项将传播到依赖项目。
运行时
此作用域指示依赖项不是编译所必需的,而是执行所必需的。它位于运行时和测试类路径中,但不在编译类路径中。
例如,如果我们在POM中有以下两个依赖项:
字符串
然后,在编译模块的过程中,来自
commons-logging-api
的类将位于类路径上,而来自commons-logging
的类将不可用-如果我偶然在项目的某个类中直接引用了来自commons-logging
的类,那么构建将失败。然而,在运行时或测试编译和执行期间,来自commons-logging的类将位于类路径上,因此可以使用(即,来自
commons-logging-api
的类,或直接在项目的测试中使用)。当您的项目在另一个项目中被引用为依赖项时,Maven会以可传递的方式(在同一范围内)包含
compile
和runtime
依赖项。p.s.正如kostja提到的,还有
provided
范围提供
这很像编译,但表示您希望JDK或容器在运行时提供依赖项。例如,为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API上的依赖项设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。
基本上,
provided
和compile
之间的区别在于provided
依赖项是不可传递的。bxfogqkk2#
假设您正在将应用程序部署到一个Java EE兼容的服务器上,该服务器提供了实现Java EE标准的所有库,因此您不需要将它们与应用程序一起部署。
在开发过程中,您将需要具有编译时作用域的Java EE库,因为您需要编译类。
但是在运行时,依赖项是由应用服务器提供的。Maven在这种情况下使用“提供”作用域。