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");
}
}
目录结构如下:
再次执行main函数,控制台输出:api-demo
结论:
1、maven遇到同名类,在pom中先声明的先加载
2、本地类的加载顺序,优先于依赖包中的类
用途:
利用第2点结论的特性,在单元测试中,我们可以新建与依赖包中同名的类,以实现mock。比如,这样可以不依赖中间件进行单测了