重點:這個項目打成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查找它。