maven dependency中provided和compile的区别
重点:这个项目打成war包时,scope=provided的jar包,不会出现在WEB-INFO/lib目录下,而scope=compile的jar包,会放到WEB-INFO/lib目录
scope=compile(默认)
对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个jar包在classpath中。
当我们用maven install生成最终的构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,而不会包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。
scope=provided
scope=provided的情况,则可以认为这个provided是目标容器已经provide这个jar。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个app对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的tomcat容器)已经提供了这个jar包,所以无需我们打包对应的jar包了。在运行阶段,app可以直接使用容器提供的jar。
scope的其他参数如下:
-
compile
默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布
-
provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。
-
runtime
表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。
-
test
表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
-
system
跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
--------------------------------------------------------------------------------------------------------------------
个性签名:以梦为马,驰骋岁月;以梦为马,诗酒趁年华!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个 “推荐” 哦,博主在此感谢!