同名类的加载顺序

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。比如,这样可以不依赖中间件进行单测了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容