1.依賴範圍
非compile範圍依賴不能傳遞
2.maven依賴傳遞
依賴的傳遞性:如果A—>B,B—>C,那麼A—>C。無限層傳遞。
假設現在:
(1)
A----->B------>C
A自己有依賴了C,如果A現在自己又依賴了C,如果A依賴的C和B傳遞過來的
C版本不一樣那麼這時候就會有問題
我在第一個maven工程:
然後在第2個工程中依賴了第一個maven工程同時又定義了:
log4j的版本爲1.2.16如圖提示依賴衝突:
我們也可以安裝一個maven Helper的插件:
(2)
A----->M------>D1.0
A ----->N------>D1.1
2個D的版本不一致那麼現在就會有版本問題
2個工程都有log4j的依賴
3.依賴排除
方式一:在聲明依賴處排除,適合單處排除。
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
方式二:在遠聲明依賴處排除,適合多處排除。
<optional>true</optional>
4.maven自己提供的解決衝突的原則
1、最短路徑原則:
maven-04-dependency--->maven-03-dependencied2--->maven-03-dependencied---->log4j1.2.12
--->maven-03-commons------>log4j1.2.11
2、最先聲明原則(路徑一樣長)
maven-04-dependency--->maven-03-dependencied2---->log4j1.2.12
--->maven-03-commons------>log4j1.2.11
取最先定義的log4j1.2.12
5.maven的全局變量
自定義變量:
<properties>
<spring.version>4.3.11.RELEASE</spring.version>
</properties>
${變量名} ${spring.version}
內置變量:maven定義好的,可以直接使用
${project.version}
6.maven繼承
Maven的聚合:在maven中每一個工程都具有獨立構件能力,但是如果工程數量增多,而且工程之間有依賴關係,手動構建很麻煩,幾乎不可能手動構建。
所謂聚合,就是把多個模塊或項目聚合到一起,創建一個專門的工程進行統一進行管理和構建。
在pom中使用標籤來實現,Maven會自動分析模塊之間的構建順序和依賴關係。
1、子POM可以從父POM中繼承的元素:
groupId、version、properties、dependencies、build、repositories、pluginRepositories、distributionManagement、dependencyManagement
<finalName>雖然能繼承,但是一般都是配置自己的名字。
2、打包方式<packaging>:jar(默認。java工程)、war(web工程)、pom(所有含有子模塊的模塊,打包方式必須是pom)
父POM的打包方式必須是pom。
3、所有模塊或者大多數模塊都會使用的配置,在父POM中聲明:
properties、groupId、version、dependencies(非compile範圍的公共依賴)、build(plugins)
dependencies(非compile範圍的公共依賴):junit、servlet、jsp
<dependencies>:聲明依賴,實際引入。
<dependencyManagement>:管理依賴。聲明依賴,不實際引入,僅僅是聲明。
類似的還有:<plugins>和<pluginManagement>