maven scope 'provided' 和 ‘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專案