您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
17-依赖范围详解
发布时间:2022-10-13 21:39:38编辑:雪饮阅读()
对于昨天出现的is not a Servlet错误。我们昨天只是在pom.xml对应依赖里面加了scope为provided就解决了该问题,那么为什么provided就能解决这个问题呢?
看看依赖范围是怎么说的:
compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided: provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用,provided依赖在编译和测试时需要,在运行时不需要,比如: servlet api被tomcat容器提供。
runtime: runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如: jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
test: test范围依赖在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如: junit。由于运行时不需要所以test范围依赖不会被打包。
system: system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
总结
总的来说scope的不同值,在不同生命周期是否产生该scope所属的依赖(jar),那么这里的对于编译、对于测试、对于运行时就正好是不同的生命周期。
我们进行测试时候maven项目的话一般可以用package生命周期测试(包含了compile和test,那么下一步就是部署到tomcat运行,那么运行时依赖都是在tomcat上的(对于web项目而言))。
而我们昨天需要的servlet-api若没有配置scope,则默认scope就是compile,可以看到compile是对这三个生命周期都有效,对于前两个生命周期有效也就罢了,但是对于运行时有效,那么运行时候由于在tomcat上运行,则tomcat如D:\software\apache-maven-3.6.0-bin\apache-maven-3.6.0\lib这个路径中就有个该依赖。这样就会导致依赖冲突的。
但是你如果认为由于tomcat中有servlet-api所以就干脆不要该dependency,那么由于开发环境(编译时期)是标准java(javase)环境不包含servlet-api,所以编译是编译不通过的。
注意:
测试时候可以通过maven生命周期的clean(如果项目处于运行状态(浏览器可访问,则需要先停止,否则clean会失败报错))来测试每次产生的jar包。
每次package生命周期产生的打包后路径如:
Building war: C:\Users\Administrator\IdeaProjects\untitled8\target\untitled8-1.0-SNAPSHOT.war
则这里我们就在这个war包所在路径该war包同名目录下查看到是否有你的依赖包产生。
关键字词:依赖,范围,详解