Maven的依赖范围有哪些?

Maven的依赖范围主要有:

  1. compile:默认范围,该范围的依赖会被编译,测试和运行时使用。
  2. test:该范围的依赖只在测试编译和测试运行阶段使用,不会被主代码使用。
  3. provided:该范围的依赖在编译和测试时使用,但在运行时不会使用。因为容器或使用者已经提供。例如servlet-api。
  4. runtime:该范围的依赖在运行和测试阶段使用,但在编译阶段不会使用。
  5. system:该范围的依赖与provided相似,但是必须显示的提供一个对系统中JAR文件的路径。不推荐使用。
  6. import:该范围只在dependencyManagement区块中使用,用来引入外部的pom的dependencyManagement区块中的声明。

一个简单的例子:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>  
        <artifactId>httpclient</artifactId>  
        <version>4.5.1</version>  
        <scope>runtime</scope>  
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
  • junit的依赖范围为test,只在测试时使用。
  • httpclient的依赖范围为runtime,在运行时使用,编译时不使用。
  • servlet-api的依赖范围为provided,编译和测试时使用,运行时由容器提供,不使用。

理解不同依赖范围的含义,可以让我们的依赖声明更加准确,减少不必要的依赖,使项目具有更高的内聚性。这也是我们进行Maven依赖管理的基础。