建立一個maven工程,引入spring-context包。web
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.8.RELEASE</version> </dependency>
此時看左側的lib,咱們發現引入了一個座標,多出了不少的jar包,這個現象叫作依賴傳遞,就是說,當前座標所依賴的jar包也會一同引入進來,這裏的版本都是5.0.8的。 接下來,咱們再引入一個springmvc。咱們換一個版本,咱們引入4.2.4版本spring
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.4.RELEASE</version> </dependency>
咱們經過idea給的maven分析圖能夠看出,mvc和context都依賴與sprng-core一個,依賴的是5.0.8版本,一個依賴的是4.2.4版本。 那麼真正加載的是哪一個版本呢。是5.0.8版本。 此時就是存在了jar包的衝突問題,那麼咱們解決這個問題,有三種方式。mvc
此時咱們的pom文件中是先聲明的5.0.8版本,後聲明的4.2.4版本,咱們將其調換順序。 此時咱們發現他們共同依賴的jar包,都變成了4.2.4版本,這就是聲明優先原則。maven
好比,咱們不想調換順序,咱們就是想使用4.2.4版本的spring-core。咱們能夠單獨引入進來。 此時再看,咱們發現依賴的spring-core已經變成了4.2.4版本了。 這個就是就近優先原則,就近優先是直接依賴,直接依賴的優先級大於傳遞依賴的優先級。ide
這種方式咱們能夠直接排除spring-context中的spring-core的傳遞依賴。 再看依賴,此時已經改成4.2.4. 使用exclusions標籤的時候,其內部不用寫版本號,這是惟一不用寫版本號的一種狀況。由於他默認就去找當前依賴的版本了。idea