Maven 的依赖范围

Maven 在编译项目主代码的时候须要使用一套 classpath,在编译和执行测试的时候会使用另一套 classpath。最后,实际运行 Maven 项目的时候,又会使用一套 classpath。依赖范围就是用来控制依赖与这三种 classpath 的关系的。java

如,下面示例,junit 的依赖范围就是 test。api

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

Maven 公有如下几种依赖范围:maven

  • compile: 编译依赖范围,若是没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven 依赖,对于编译,测试和运行三种 classpath 都有效。ide

  • test: 测试依赖范围。使用此依赖范围的 Maven 依赖,只对于 测试 classpath 有效,在编译主代码或者运行项目使用时将没法使用此依赖。典型的例子就是 Junit。测试

  • provided: 已提供依赖范围。使用此依赖范围的 Maven 依赖,对于编译和测试 classpath 有效,但在运行项目的时候无效。典型的例子就是 servlet-api,编译和测试项目时候,须要该依赖,可是在运行项目时,因为容器已经提供,就不须要 maven 重复的引入一遍。spa

    <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
  • runtime: 运行时依赖范围。使用此依赖的 Maven 依赖,对于测试和运行的 classpath 有效,但在编译主代码时无效。典型的例子就是 JDBC 驱动实现。项目主代码的编译只须要 JDK 提供的 JDBC 接口,只有在执行测试或者运行项目时才须要实现上述接口的具体 JDBC 驱动。code

除了以上 4 种类型外,还有 import 和 system, 不经常使用,此处暂不介绍。xml

参考资料:《Maven 实战》接口

相关文章
相关标签/搜索