两个具有不同范围的Maven依赖项

时间:2018-04-11 18:07:21

标签: maven maven-dependency

如果我在同一个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 个答案:

答案 0 :(得分:2)

来自Introduction to the Dependency Mechanism - Dependency Scope

  
      
  • compile      
        
    • 这是默认范围,如果未指定,则使用此范围。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
    •   
  •   
     

(...)

     
      
  • runtime      
        
    • 此范围表示编译不需要依赖项,但是用于执行。它位于运行时和测试类路径中,但不是编译类路径。
    •   
  •   

因此,如果您有compile依赖项,runtime已经包含在内,因此是多余的。

作为何时使用runtime的示例,请使用SLF4J日志记录API:您针对slf4j-api.jarcompile依赖项)编译源代码,但不是实际实现,它是单独分发的(有几个可供选择)。但是,在打包应用程序或运行单元测试时,Maven应该仍然包含一个实现jar,例如: slf4j-simple.jarruntime依赖项),因为否则不会记录任何内容。