java maven scope compile,provide,system,test,runtime

 

在一個maven項目中,若是存在編譯須要而發佈不須要的jar包,能夠用scope標籤,值設爲provided。以下:java

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
            <classifier />
        </dependency>web

scope的其餘參數以下:api

compile
默認的scope,表示 dependency 均可以在生命週期中使用。並且,這些dependencies 會傳遞到依賴的項目中。適用於全部階段,會隨着項目一塊兒發佈
provided
跟compile類似,可是代表了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能做用在編譯和測試時,同時沒有傳遞性。????????
runtime
表示dependency不做用在編譯時,但會做用在運行和測試時,如JDBC驅動,適用運行和測試階段。
test
表示dependency做用在測試時,不做用在運行時。 只在測試時使用,用於編譯和運行測試代碼。不會隨項目發佈。
system
跟provided 類似,可是在系統中要之外部JAR包的形式提供,maven不會在repository查找它。
---------------------
做者:daihui05
來源:CSDN
原文:https://blog.csdn.net/daihui05/article/details/7476976
版權聲明:本文爲博主原創文章,轉載請附上博文連接!tomcat

 

問題再現:服務器

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

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

他們問我scope在何種狀況下要設置爲provided,以及和scope設置爲compile的區別。webapp

 

解釋:jsp

其實這個問題很簡單。maven

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

而對於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包。這也避免了此類構件當部署到目標容器後產生包依賴衝突。

相關文章
相關標籤/搜索