两个不同范围的 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.jarcompile 依赖项)编译源代码,而不是实际实现,它是单独分发的(并且存在有几个可供选择)。但是,在打包应用程序或运行单元测试时,Maven 仍应包含一个实现 jar,例如slf4j-simple.jarruntime 依赖项),否则不会记录任何内容。

【讨论】:

以上是关于两个不同范围的 Maven 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Maven + SLF4J:使用需要两个不同 SLF4J 版本的两个不同依赖项时的版本冲突

提供两个不同战争的多模块项目

java maven项目中的库版本冲突

如何使用不同的分类器在 Ivy 中下载多个 Maven 依赖项?

如果使用的 JVM 是 x86 或 x64,则以不同方式解决 Maven 依赖项?

不排除 Maven 瞬态依赖项(库/jar vaadin json)