maven在遇到同名類時,加載順序如何?我們做實驗測試下。
出現同名類的情況如下,不同包下的MyApi類完全一樣:
1、demo應用依賴了api-v1的MyApi類
2、demo應用依賴了api-v2的MyApi類
api-v1版本的代碼如下:
package org.example.api;
/**
* @author xxx
* @date 2022/4/22 11:20 下午
*/
public class MyApi {
public void echo() {
System.out.println("api-v1");
}
}
api-v2版本的代碼如下:
package org.example.api;
/**
* @author xxx
* @date 2022/4/22 11:19 下午
*/
public class MyApi {
public void echo() {
System.out.println("api-v2");
}
}
demo調用如下:
package org.example.demo;
import org.example.api.MyApi;
/**
* @author xxx
* @date 2022/4/22 11:22 下午
*/
public class App {
public static void main(String[] args) {
MyApi myApi = new MyApi();
myApi.echo();
}
}
當pom中的引入順序是下面這種情況,控制臺輸出:api-v1:
<dependencies>
<dependency>
<groupId>org.example.api</groupId>
<artifactId>api-v1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example.api</groupId>
<artifactId>api-v2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
當pom中的引入順序是下面這種情況,控制臺輸出:api-v2:
<dependencies>
<dependency>
<groupId>org.example.api</groupId>
<artifactId>api-v2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example.api</groupId>
<artifactId>api-v1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
再做一個實驗,在demo工程本地也新建一個同名的MyApi類:
package org.example.api;
/**
* @author xxx
* @date 2022/4/22 11:25 下午
*/
public class MyApi {
public void echo() {
System.out.println("api-demo");
}
}
目錄結構如下:
image.png
再次執行main函數,控制臺輸出:api-demo
結論:
1、maven遇到同名類,在pom中先聲明的先加載
2、本地類的加載順序,優先于依賴包中的類
用途:
利用第2點結論的特性,在單元測試中,我們可以新建與依賴包中同名的類,以實現mock。比如,這樣可以不依賴中間件進行單測了