Maven依赖范围

更新于:2024-10-01     浏览:47252 次  

因为 Maven 执行一系列操作,主要包括编译、测试、运行等操作,在不同的操作下依赖的 Jar 不同,依赖范围就是用来控制 Jar 包的可见性。例如,JUnit 的依赖范围是test,只用于编译测试代码和运行测试代码的时候才可见,而在编译和运行主项目时无法使用此依赖。


有些依赖编译用不到,只有运行的时候才能用到,比如 MySQL 的驱动包在编译期就用不到(编译期用的是JDBC接口),而是在运行时用到的。


还有些依赖,编译期要用到,而运行期不需要提供,因为有些容器已经提供了,比如 servlet-api.jar 在 Tomcat 中已经提供了,我们只需要的是编译期提供而已。

Maven库与依赖范围

Maven中的库是个物理概念,存放各种依赖 Jar,而依赖是个逻辑概念,指定所依赖 Jar 的可见性。


这种可见性是按照编译、测试、运行等三种情况来划分的。

Maven依赖范围

compile

编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种都有效,即在编译、测试和运行的时候都要使用该依赖 Jar 包。

test

测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试,而在编译和运行项目时无法使用此类依赖,典型的是 JUnit,它只用于编译测试代码和运行测试代码的时候才需要。

provided

此依赖范围,对于编译和测试有效,而对运行时无效。比如 servlet-api.jar 在 Tomcat 中已经提供了,我们只需要的是编译期提供而已。

runtime

运行时依赖范围,对于测试和运行有效,但是在编译主代码时无效,典型的就是JDBC驱动实现。

system

系统依赖范围,使用 system 范围的依赖时必须通过 systemPath 元素显示地指定依赖文件的路径,不依赖 Maven 仓库解析,所以可能会造成建构的不可移植。

<dependencies>
	<dependency>  
		<groupId>javax.sql</groupId>  
		<artifactId>jdbc-stdext</artifactId>  
		<version>2.0</version>  
		<scope>system</scope>  
		<systemPath>${java.home}/lib/rt.jar</systemPath>  
	</dependency>  
<dependencies>