maven依賴 dependency中scope=compile 和 provided區別


問題再現

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

<dependency> <groupId>com.liferay.portal</groupId> <artifactId>portal-impl</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

他們問我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包。這也避免了此類構件當部署到目標容器后產生包依賴沖突。

依賴范圍

maven中三種classpath 
編譯,測試,運行 
1.compile:默認范圍,編譯測試運行都有效 
2.provided:在編譯和測試時有效 
3.runtime:在測試和運行時有效 
4.test:只在測試時有效 
5.system:在編譯和測試時有效,與本機系統關聯,可移植性差

pom.xml常用元素介紹

project 包含pom一些約束的信息 
modelVersion 指定當前pom的版本 
groupId(主項目標示,定義當前maven屬於哪個項目,反寫公司網址+項目名)、 
artifactId(實際項目模塊標識,項目名+模塊名)、 
version(當前項目版本號,第一個0標識大版本號,第二個0標示分支版本號,第三個0標識小版本號,0.0.1,snapshot快照,alpha內部測試,beta公測,release穩定,GA正式發布) 
name項目描述名 
url項目地址 
description項目描述 
developers開發人員列表 
licenses許可證 
organization:組織 
dependencies:依賴列表 
dependency:依賴項目 里面放置坐標 
scope:包的依賴范圍 test 
optional :設置依賴是否可選 
exclusions:排除依賴傳遞列表 
dependencyManagement 依賴的管理 
build:為構建行為提供支持 
plugins:插件列表 
parent:子模塊對父模塊的繼承 
modules:聚合多個maven項目

參考: 

http://supercharles888.blog.51cto.com/609344/981316/

from:https://blog.csdn.net/mccand1234/article/details/60962283


免責聲明!

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



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