在命令行环境使用Maven
六、依赖的范围
1.依赖范围
当我们pom.xml文件中添加依赖时,通常会这样写,例如:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
前面的章节,已经见过GAV的坐标系的作用了,那么scope标签到底有什么用呢?
scope标签代表引入jar包的作用范围
scope标签可选值有这几个:compile、test、provided、system、runtime、import
①compile和test对比
main目录 | test目录 | 开发过程 | 部署到服务器 | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效 |
test | 无效 | 有效 | 有效 | 无效 |
②compile和provide对比
main目录 | test目录 | 开发过程 | 部署到服务器 | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效 |
provided | 有效 | 有效 | 有效 | 无效 |
针对provided,代表已提供的意思。就是比如说 tomcat人家自带的一些jar包,在我们的工程中要配置为provided,不参与打包,避免引起冲突,用人家自己的,我们导入只在开发阶段使用。
③结论
其实maven设置scope标签是为了什么呢?就是为了特殊的比如test等情况的范围 和 默认情况的 区分开,而compile就是默认的,全部都有效的范围。
compile:通常使用的第三方框架的jar包这种在项目实际运行中真正要用到的jar包都是以compile范围进行依赖的,比如SSM框架等所需的jar包。主体功能里需要用到的jar包,99%
test:测试过程中使用的jar包,以test范围依赖进来。比如junit
provided:在开发过程中需要用到的服务器上的jar包,通常以provided范围依赖进来。比如servlet-api、jsp-api等。而这个范围的jar包之所以不参与部署、不放进war包,就是避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担。说白了,就是“服务器上已经有了,你就别带了”
2.测试
在各个目录下,针对不同范围的引入,尝试引入jar包内的类即可。能引入就是有效,不能引入就是无效。
①验证compile范围对main目录有效
②验证test范围对main目录无效
③验证test和provided范围不参与服务器部署
打包后,查看lib目录下是否存在相关jar包,就能看出是否参与打包了。