不同jar包相同同名类--Classloader.getResource--slf4j原理

以下是代码实验

public class Test {

    public static void main(String[] args) throws Exception{

        //当前Test类所在目录(包)的a.txt
       System.out.println(Test.class.getResource("a.txt"));
        //当前项目的根目录的a.txt
      System.out.println(Test.class.getResource("/a.txt"));

        ClassLoader classLoader = Test.class.getClassLoader();
        //从classpath(包括项目路径)查找[java/lang/Byte.class],可以在项目自建同名类java/lang/Byte,实验
        Enumeration<URL> paths  = classLoader.getResources("java/lang/Byte.class");
        while (paths.hasMoreElements()){
            //在idea编辑器如果输出两次同路径rt.jar!/java/lang/Byte.class,是因为执行是把rt.jar的路径在classpath又添加了一次
            //查看idea的run输出框的第一行执行的命令与参数,java -classpath "***rt.jar***"
            System.out.println(paths.nextElement());
        }
    }
}

所以使用 classLoader.getResources 可以知道当前项目的类库中是否有某个类
slf4j查找实现日志接口的库(log4j,logback等待)的方法

从 LoggerFactory.getLogger(Test.class); 开始追代码,会看到LoggerFactory的【bind()】方法调用【findPossibleStaticLoggerBinderPathSet】方法内查找STATIC_LOGGER_BINDER_PATH类的实现

所以常见的异常就可以理解了
1. Defaulting to no-operation (NOP) logger implementation 未找到实现类
2. Class path contains multiple SLF4J bindings. 找到多个实现类(同时加载了log4j和logback等等)

拓展:加载自定义类

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值