Maven(四)Maven的依賴

第三個工程

我們接下來建立第三個maven工程。

工程座標:

groupId:com.veeja.maven
ArtifactId:MakeFriends
Package:com.veeja.maven

在src/main/java中新建類com.veeja.maven.MakeFriends:

package com.veeja.maven;

public class MakeFriends {
	public String makeFriends(String name) {
		HelloFriend friend = new HelloFriend();
		friend.sayHelloToFriend("litingwei");
		String str = "Hey," + friend.getMyName() + " make a friend please.";
		System.out.println(str);
		return str;
	}
}

在src/test/java中新建類com.veeja.maven.MakeFriendsTest:

package com.veeja.maven;

import static junit.framework.Assert.assertEquals;
import org.junit.Test;

public class MakeFriendsTest {
	@Test
	public void testMakeFriends() {
		MakeFriends makeFriend = new MakeFriends();
		String str = makeFriend.makeFriends("litingwei");
		assertEquals("Hey,John make a friend please.", str);
	}
}

接下來,我們要引入依賴信息。

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.9</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>com.veeja.maven</groupId>
		<artifactId>HelloFriend</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<type>jar</type>
		<scope>compile</scope>
	</dependency>
</dependencies>

添加完依賴信息,就會生成我們的Maven依賴:
在這裏插入圖片描述

這個時候我們程序就不會報錯了,但是我們編譯一下,右鍵項目-Run As-Maven build-compile,我們發現:
在這裏插入圖片描述
構建失敗,找不到HelloFriend.jar。這是因爲我們以前的HelloFriend並沒有安裝到我們的Maven倉庫中,我們把HelloFriend安裝一下,maven install。然後再次compile一下,就成功了:
在這裏插入圖片描述

Maven的依賴[高級]

接下來我們藉助上面的工程,我們分析一下其他的依賴問題。

1. 依賴的傳遞性

我們回顧一下創建的三個工程,HelloMaven——HelloFriend——MakeFriends,它們是一層層依賴的。
這個時候,我們想在HelloMaven中添加一個spring-core依賴。

我們在pom文件中添加:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>4.0.0.RELEASE</version>
	<scope>compile</scope>
</dependency>

我們注意這麼幾點,首先是這個依賴範圍是compile
其次在Maven dependencies中出現了相應的jar包,
在這裏插入圖片描述
然後我們去HelloFriend工程下面找一找,發現:
在這裏插入圖片描述
這個工程也自動引入了這個文件。
我們可以在HelloFriend的pom文件中的依賴層次結構中,直觀形象的看到這一點:
在這裏插入圖片描述

我們在把HelloMaven中spring-core的依賴範圍修改爲test,
在這裏插入圖片描述
我們再去看一看HelloFriend中,
在這裏插入圖片描述
spring-core.jar消失了。

最後我們修改爲provided,
在這裏插入圖片描述
我們再去看一看HelloFriend中,
在這裏插入圖片描述
也是沒有的。

這個時候我們可以得出一些簡單的結論,
1. 非compile範圍的依賴不能傳遞,必須在有需要的工程中單獨加入。
2. 依賴的傳遞性使得可以傳遞的依賴不必在每個模塊工程中都重複聲明,在“最底層”的工程中依賴一次即可。

2. 依賴的排除

我們再看上面的例子,
在HelloMaven引入了spring-core.jar,依賴的範圍是compile,因爲依賴的傳遞性,在HelloFriend中也會出現相應的jar包。
在這裏插入圖片描述
但是我們可以注意到,不僅有了spring-core的jar包,還有一個commons-logging的jar包,其實這也很簡單,因爲spring-core是依賴commons-logging的。
但是,如果我們不想HelloFriend把commons-logging給帶進來,只需要spring-core怎麼辦?
這個時候我們就要用到依賴的排除。

依賴排除的設置
我們需要在依賴中設置一個標籤:
在這裏插入圖片描述
其中的groupID和artifactID填寫對應jar包的信息就可以了。如果我們不知道commons-logging的對應信息,可以在Dependency Hierarchy選項卡中對着相應的jar右鍵,點擊Open POM:

在這裏插入圖片描述
在這裏面就可以找到相對應的信息了:
在這裏插入圖片描述
添加上依賴排除信息,然後保存pom文件。
在這裏插入圖片描述
這個時候我們就發現,HelloFriend中就會去掉相應的jar包了。
在這裏插入圖片描述

3. 依賴的原則

依賴的原則是爲了解決模塊工程之間的jar包衝突問題。

① 路徑最短者優先

我們舉一個例子。
比如存在以下依賴關係:
在這裏插入圖片描述
1依賴2;
2依賴3,2依賴xxx-1.0.1;
3依賴xxx-1.0.2。

根據依賴的傳遞性,1會同時依賴xxx-1.0.1和xxx-1.0.2。那麼這個時候,1會依賴哪一個呢?
答案是1會依賴xxx-1.0.1,因爲1到xxx-1.0.1的路徑長度爲2,1到xxx-1.0.2的路徑長度爲3。
在這裏插入圖片描述
這就是路徑最短者優先原則。

② 路徑相同時先聲明者優先

如果有以下場景,
1依賴2;2依賴xxx-1.0.1;
1依賴3;3依賴xxx-1.0.2。
在這裏插入圖片描述
這個時候,依賴會怎麼傳遞呢?
那麼就會根據先聲明者優先原則。
在1的pom文件中,先聲明的依賴會被採納,也就是如果你在1中先聲明瞭2依賴,就會使用1.0.1,如果先聲明瞭3,就會採用1.0.2。

4. 統一管理依賴的版本

比如有一種這樣的情況:
在這裏插入圖片描述
這裏對Spring各個jar包的依賴版本都是4.0.0,如果需要統一升級爲4.1.1,怎麼辦?手動逐一修改不太可靠,既繁瑣又容易出錯。

建議的配置方式:
使用properties標籤內使用自定義標籤統一聲明版本號,例如:

<properties>
	<veeja.spring.version>4.0.0</veeja.spring.version>
</properties>

在需要統一版本的位置,使用${自定義標籤名}引用聲明,即:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>${veeja.spring.version}</version>
	<scope>compile</scope>
</dependency>

這樣就完成了對版本的統一控制。

其實properties標籤配合自定義標籤聲明數據的配置並不是只能用於聲明依賴的版本號。凡是需要統一聲明後再引用的場合都可以使用。


END.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章