上次這邊朋友問我一個問題,就是他們在pom.xml中的dependency中,看到有一些是provided的狀況,好比以下:web
<dependency> <groupId>com.liferay.portal</groupId> <artifactId>portal-impl</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency>
他們問我scope在何種狀況下要設置爲provided,以及和scope設置爲compile的區別。tomcat
其實這個問題很簡單。
對於scope=compile的狀況(默認scope),也就是說這個項目在編譯,測試,運行階段都須要這個artifact(模塊)對應的jar包在classpath中。
而對於scope=provided的狀況,則能夠認爲這個provided是目標容器已經provide這個artifact。換句話說,它隻影響到編譯,測試階段。在編譯測試階段,咱們須要這個artifact對應的jar包在classpath中,而在運行階段,假定目標的容器(好比咱們這裏的liferay容器)已經提供了這個jar包,因此無需咱們這個artifact對應的jar包了。服務器
好比說,假定咱們本身的項目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類,而不會出任何問題。app
剛纔咱們講述的是理論部分,如今咱們看下,實際插件在運行時候,是如何來區別對待scope=compile和scope=provided的狀況的。
作一個實驗就能夠很容易發現,當咱們用maven install生成最終的構件包ProjectABC.war後,在其下的WEB-INF/lib中,會包含咱們被標註爲scope=compile的構件的jar包,而不會包含咱們被標註爲scope=provided的構件的jar包。這也避免了此類構件當部署到目標容器後產生包依賴衝突。webapp
maven中三種classpath
編譯,測試,運行
1.compile:默認範圍,編譯測試運行都有效
2.provided:在編譯和測試時有效
3.runtime:在測試和運行時有效
4.test:只在測試時有效
5.system:在編譯和測試時有效,與本機系統關聯,可移植性差maven
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項目ide
參考: 測試
http://supercharles888.blog.51cto.com/609344/981316/ui
from:https://blog.csdn.net/mccand1234/article/details/60962283url