Maven的依赖范围主要有:
- compile:默认范围,该范围的依赖会被编译,测试和运行时使用。
- test:该范围的依赖只在测试编译和测试运行阶段使用,不会被主代码使用。
- provided:该范围的依赖在编译和测试时使用,但在运行时不会使用。因为容器或使用者已经提供。例如servlet-api。
- runtime:该范围的依赖在运行和测试阶段使用,但在编译阶段不会使用。
- system:该范围的依赖与provided相似,但是必须显示的提供一个对系统中JAR文件的路径。不推荐使用。
- 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依赖管理的基础。