同名类的加载顺序

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:

    
        
            org.example.api
            api-v1
            1.0-SNAPSHOT
        
        
            org.example.api
            api-v2
            1.0-SNAPSHOT
        
    

当pom中的引入顺序是下面这种情况,控制台输出:api-v2:

    
        
            org.example.api
            api-v2
            1.0-SNAPSHOT
        
        
            org.example.api
            api-v1
            1.0-SNAPSHOT
        
    

再做一个实验,在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。比如,这样可以不依赖中间件进行单测了

你可能感兴趣的:(同名类的加载顺序)