两个不同范围的 Maven 依赖项
Posted
技术标签:
【中文标题】两个不同范围的 Maven 依赖项【英文标题】:Two Maven Dependencies with different scope 【发布时间】:2018-09-21 17:40:34 【问题描述】:如果我在同一个pom.xml
文件中有以下两个依赖项:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
我想删除冗余。那么我应该删除范围为runtime
的那个,因为它包含在另一个依赖项中吗?
我也很高兴理解为什么要指定一个范围为runtime
的依赖项。
【问题讨论】:
【参考方案1】:来自Introduction to the Dependency Mechanism - Dependency Scope:
compile
这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项会传播到相关项目。(...)
runtime
此范围表示依赖项不是编译所必需的,而是执行所必需的。它位于运行时和测试类路径中,但不在编译类路径中。
因此,如果您有 compile
依赖项,则 runtime
已包含在内,因此是多余的。
作为何时使用 runtime
的示例,以 SLF4J 日志记录 API 为例:您针对 slf4j-api.jar
(compile
依赖项)编译源代码,而不是实际实现,它是单独分发的(并且存在有几个可供选择)。但是,在打包应用程序或运行单元测试时,Maven 仍应包含一个实现 jar,例如slf4j-simple.jar
(runtime
依赖项),否则不会记录任何内容。
【讨论】:
以上是关于两个不同范围的 Maven 依赖项的主要内容,如果未能解决你的问题,请参考以下文章
Maven + SLF4J:使用需要两个不同 SLF4J 版本的两个不同依赖项时的版本冲突
如何使用不同的分类器在 Ivy 中下载多个 Maven 依赖项?