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的其他參數如下:

  1. compile

    ​ 默認的scope,表示 dependency 都可以在生命周期中使用。而且,這些dependencies 會傳遞到依賴的項目中。適用於所有階段,會隨着項目一起發布

  2. provided

    ​ 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。

  3. runtime

    ​ 表示dependency不作用在編譯時,但會作用在運行和測試時,如JDBC驅動,適用運行和測試階段。

  4. test

    ​ 表示dependency作用在測試時,不作用在運行時。 只在測試時使用,用於編譯和運行測試代碼。不會隨項目發布。

  5. system

    ​ 跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查找它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM