1.Maven中的依赖作用范围概述
Maven中使用 scope
来指定当前包的依赖范围和依赖的传递性。常见的可选值有:compile, provided, runtime, test, system 等。scope
主要是用在 pom.xml
文件中的依赖定义部分,例如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.1.RELEASE</version>
<scope>test</scope>
</dependency>
2.scope各种取值详解
scope取值 | 有效范围(compile, runtime, test) | 依赖传递 | 例子 |
---|---|---|---|
compile | all | 是 | spring-core |
provided | compile, test | 否 | servlet-api |
runtime | runtime, test | 是 | JDBC驱动 |
test | test | 否 | JUnit |
system | compile, test | 是 |
正如上表所示,
compile :为默认的依赖作用范围。如果在定义依赖关系的时候,没有明确指定依赖作用范围的话,则默认采用该依赖作用范围。此种依赖,在编译、运行、测试时均有效。
provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api.jar
,编译时需要继承HttpServlet
,自然需要引入该jar包,但运行项目时,Servlet容器即Tomcat已经提供该jar包,就不需要Maven重复地引入一遍了
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现mysql-connector-java.jar
,项目代码编译只需要JDK提供的JDBC接口,即java.sql.xx
包,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动即com.mysql.jdbc.Driver
。
<!-- 因为在代码编译期可能需要使用JDBC API(例如:重写数据源连接方式),所以作用域设置为provided ,
而在运行的时候才需要JDBC的驱动才可以。所以下面的数据库连接作用域一般都设置为runtime-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>provided</scope>
</dependency>
<!-- 数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
test :只在测试时有效,例如:JUnit。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。例如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
网友评论