日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

maven dependency中scope=compile 和 provided区别

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maven dependency中scope=compile 和 provided区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題再現:

上次這邊朋友問我一個問題,就是他們在pom.xml中的dependency中,看到有一些是<scope>provided</scope>的情況,比如如下:

  • <dependency>?
  • ???<groupId>com.liferay.portal</groupId>?
  • ???<artifactId>portal-impl</artifactId>?
  • ???<version>6.1.0</version>?
  • ???<scope>provided</scope>?
  • </dependency>?
  • 他們問我scope在何種情況下要設置為provided,以及和scope設置為compile的區別。

    ?

    解釋:

    其實這個問題很簡單。

    對于scope=compile的情況(默認scope),也就是說這個項目在編譯,測試,運行階段都需要這個artifact對應的jar包在classpath中。

    而對于scope=provided的情況,則可以認為這個provided是目標容器已經provide這個artifact。換句話說,它只影響到編譯,測試階段。在編譯測試階段,我們需要這個artifact對應的jar包在classpath中,而在運行階段,假定目標的容器(比如我們這里的liferay容器)已經提供了這個jar包,所以無需我們這個artifact對應的jar包了。

    ?

    聽起來很玄乎,對吧,其實一點也不難理解。舉個scope=provided的例子。

    比如說,假定我們自己的項目ProjectABC 中有一個類叫C1,而這個C1中會import這個portal-impl的artifact中的類B1,那么在編譯階段,我們肯定需要這個B1,否則C1通不過編譯,因為我們的scope設置為provided了,所以編譯階段起作用,所以C1正確的通過了編譯。測試階段類似,故忽略。

    那么最后我們要吧ProjectABC部署到Liferay服務器上了,這時候,我們到$liferay-tomcat-home\webapps\ROOT\WEB-INF\lib下發現,里面已經有了一個portal-impl.jar了,換句話說,容器已經提供了這個artifact對應的jar,所以,我們在運行階段,這個C1類直接可以用容器提供的portal-impl.jar中的B1類,而不會出任何問題。

    ?

    實際插件的行為:

    剛才我們講述的是理論部分,現在我們看下,實際插件在運行時候,是如何來區別對待scope=compile和scope=provided的情況的。

    做一個實驗就可以很容易發現,當我們用maven install生成最終的構件包ProjectABC.war后,在其下的WEB-INF/lib中,會包含我們被標注為scope=compile的構件的jar包,而不會包含我們被標注為scope=provided的構件的jar包。這也避免了此類構件當部署到目標容器后產生包依賴沖突。

    轉載于:https://www.cnblogs.com/Jeely/p/10794878.html

    總結

    以上是生活随笔為你收集整理的maven dependency中scope=compile 和 provided区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。