maven中dependency的属性(依赖)配置
groupId,artfactId,version,type,classifier,scope,systemPath,exclusions,optional 是 maven的9種依賴屬性,
其中groupId,artfactId,version是三個基本的依賴坐標,不可缺少。
groupId------包名(一般為域名的反寫)。
artfactId------項目名。
version-------版本。
----------------------------------------------------------------------------------
type----------依賴的類型,jar或者war(默認為jar,表示依賴的是一個jar包),另外當type表示為<type>pom.lastUpdated</type>?這種屬性時,表示只將jar的描述信息加載了進來,實際的jar包并未導入。
classifier----通常是用于從同一POM構建的擁有不同內容的構件,可選屬性,可以是任意的字符串。對附加了classifier屬性的包,如果不加上classifier,maven是找不到這個包的,比如下面這個依賴:
<dependency> ?
? ? ?<groupId>net.sf.json-lib</groupId> ??
? ? ?<artifactId>json-lib</artifactId> ??
? ? ?<version>2.2.2</version> ?
</dependency>?
然后再去中央倉庫查看
發現中央倉庫中并沒有json-lib-2.2.2.jar這個包 ,自然也就找不到了,有的只是不同版本的json-lib-2.2.2.jar,這個時候classifier就可以指明所想要版本。
<dependency> ?
? ? ?<groupId>net.sf.json-lib</groupId> ??
? ? ?<artifactId>json-lib</artifactId> ??
? ? ?<version>2.2.2</version>
? ? ?<classifier>jdk15</classifier>
</dependency> ?
這樣就可以找到json-lib-2.2.2-jdk15.jar這個包
classifier不僅可以指明版本號,可以指明同一項目的不同組成部分,比如:源文件,javadoc,類文件等。在上面的圖中你會發現還有一些json-lib-2.2.2-jdk15-javadoc.jar包和json-lib-2.2.2-jdk15-source.jar包,如果你需要的是javadoc,在XML文檔中就可以這樣寫:
<dependency> ?
? ? ?<groupId>net.sf.json-lib</groupId> ??
? ? ?<artifactId>json-lib</artifactId> ??
? ? ?<version>2.2.2</version>
? ? ?<classifier>jdk15-javadoc</classifier>
</dependency> ?
同理,如果你需要的時候source包就可以把classifier寫成? jdk15-source 。
scope-----依賴作用的范圍,指通過POM加載進來的包,作用的范圍,范圍一共有:編譯時,運行時,測試時,
scope一共有compile,runtime,test,system,provided 5種屬性值,compile為其默認值,其中:
compile表示在所有范圍此jar都生效,
test表示只在測試范圍此jar生效,例如Junit(默認compile,不會報錯,擴展了test),
runtime表示在測試和運行時此jar生效,例如JDBC驅動(默認compile,不會報錯,擴展了runtime),我們在編譯時是沒有用到這個包的,只在測試和運行時會使用到,
provided表示在編譯和測試時此jar生效,例如servlet-api,jsp-api,這個的provided必須填寫,不能使用compile,原因是:
我們在eclispe里創建web項目時,eclipse為我們添加了這兩個jar包,離開了eclispe之后,到Tomcat中Tomcat又會為我們提供這兩個包,所以一直不會報錯,但是在我們創建maven項目時,我們就不是web項目了,所以eclispe不會為我們添加這兩個jar包,就需要我們通過maven來添加,但是如果設置了compile,在Tomcat中運行時,就會與Tomcat中提供的這兩個包產生沖突,所以要設置為provided,
system表示我們手動添加的包,不屬于maven倉庫,屬于別的類庫的jar包,只在編譯和測試期生效,運行時無效,一般不用,使用時,需要配合下面的systemPath使用。
systemPath--為并非依賴maven的包指明路徑。
在項目中創建一個lib作為手動導入的jar包存儲位置,
然后再pom.xml文件中添加依賴,
basedir表示根目錄。
exclusions---排除傳遞依賴,解決jar沖突問題,
依賴傳遞的意思是項目A依賴項目B,項目B依賴項目C,在使用項目A時,就會加載項目B,這樣傳遞依賴就會把項目C,D,E等等加載進來。其中B是A的直接依賴,C是A的間接依賴
例如:A項目依賴B(版本為1.1),C項目也依賴B(版本為1.2),假如現在有一個項目同時依賴項目A和項目B,那么他就會導入兩個版本的B,由于B的兩個版本不同,這里就會導致沖突,這個時候就需要exclusions來解決沖突,不過maven也有一個機制會避免兩個都加載進去,
下面先介紹maven的依賴調節原則:
1,第一原則:路徑近者優先原則
? ? ? ? ? ? ? ? ? ? ? ?A→B→C→X(1.1)
? ? ? ? ? ? ? ? ? ? ? ?D→E→X(1.2)
? ? ? ? ? ? ? ? ? ? ? ?使用X(1.2),因為其路徑更近
2,第二原則:第一聲明者優先原則
? ? ? ? ? ? ? ? ? ? ? ?A→B→X(1.1)
? ? ? ? ? ? ? ? ? ? ? ?C→D→X(1.2)
? ? ? ? ? ? ? ? ? ? ? 使用X(1.1),因為其先聲明
maven會先根據第一原則判斷,若路徑相等,再根據第二原則判斷
但是我們還是使用exclusions來配置更加合理,我們使用spring bean 和 struts2 spring plugin來舉個例子說明這個問題并使用exclusions來解決這個問題(spring bean 和 struts2 spring plugin都依賴spring-core但是版本不一樣)
先把兩個jar包在本地倉庫中找到
首先我們還是看看maven自己的解決方案:
由于是先將spring-beans導入所以使用的是spring-core(3.2)
由于是先將struts2-spring-plugin導入所以使用的是spring-core(3.0.5)
上面是路徑相同的,接下來的是路徑不同的,我建立了一個A項目和B項目,其中A項目中有jsoup-1.11.2,B項目是jsoup-1.11.1,
由于1.11.2版本的是A→jsoup-1.11.2.jar ,1.11.1版本的是A→B→jsoup.1.11.1.jar,所以最后采用jsoup-1.11.2.jar版本。
下面使用exclusions來解決問題:
這是未使用過exclusions過的xml文件當中的內容
下面即使struts2-spring-plugin先導入,也要使用spring-core(3.2),所以需要右鍵點擊struts2-spring-plugin,然后解除依賴
然后會發現
他將兩個依賴都解除了,這里手動將第二個的解除依賴刪掉就可以
最后使用的是3.2版本的spring-core
optional-----標記依賴是否可傳遞,默認值false,比如上面的項目A和項目B,
現在查看A
我現在在項目B中標注jsoup為true
再去A中查看
發現B中沒有jsoup了
optional可以用來減少項目之間jar包的沖突。
總結
以上是生活随笔為你收集整理的maven中dependency的属性(依赖)配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP直播源码js判断浏览器版本
- 下一篇: Django REST framewor