bug

记录一次热部署和第三方jar包导致的类加载问题

Posted by Timer on March 22, 2022

前置环境

第三方包里有MyTool1和MyTool2两个类。MyTool1存了一些全局变量,MyTool2去对这些变量进行修改和删除。

public class MyTool2 {
    public static void set(String s) {
        MyTool1.value = s;
    }
    public static String get() {
        return MyTool1.value;
    }
}

public class MyTool1 {
    static {
        System.out.println("第三方jar包的MyTool1被加载了,加载器为:" + MyTool1.class.getClassLoader().toString());
    }
    public static String value;
}

我引用了这个第三方包,同时我想对MyTool1做一些增强,于是我覆盖了MyTool1,自己又写了一个。

注意,这里我用了dev tools进行热部署。

public class MyTool1 {
    static {
        System.out.println("本项目的MyTool1被加载了,加载器为:" + MyTool1.class.getClassLoader().toString());
    }
    public static String value;
}

当我现在对MyTool1手动做了一些修改的时候,再用MyTool2去get它,发现这些修改都是失效的。

@org.springframework.stereotype.Controller
public class Controller {

    @RequestMapping("/test")
    @ResponseBody
    public Object test() {
        MyTool1.value = "jojo!";
        String x = MyTool2.get();
        return x;// 返回的为空
    }
}

解释

image-20220322131439869

对应类加载器输出:

image-20220322131507427

总结

  1. jar包调用混乱,以后要理清逻辑
  2. 打成jar包执行不会有问题,只是本地测试会有问题
  3. 遇见类加载问题先想是不是热部署的问题。