我在共享库中更改了类的包。我有消费者A和B消费这个库。消费者A也使用消费者B.
我正在研究Consumer A,我已经更新了共享库的.jar文件。现在在运行时我得到了一个java.lang.NoClassDefFoundError
旧包,大概是因为Consumer B仍然使用它(这是使用Spring DI,有很多依赖,我刚刚开始在Java工作,所以我不能100%确定它可能来自哪里。
在.net中,我可以使用类型转发来临时纠正这种情况,直到我还可以更新消费者B. Java中是否也存在类似的机制? (“当有人要求de.stum.old.MyObject
时,请将其发送至de.stum.new.MyObject
而不是”)
答案 0 :(得分:2)
不,JVM没有类型转发功能。你必须采取另一种方法:
您可以将新类定义为旧类(或其他方式)的子类,并保留这两个类,直到所有使用者都更新为止。当然,唯一允许MyObjects在一个方向上传递给消费者。
如果您不需要赋值兼容性,则可以同时加载旧jar和新jar(假设没有名称冲突,例如因为所有类都已移动到新包中。如果确实存在名称冲突,您可能希望使用单独的类加载器解决它们。
当然,如果你想获得真正的想象,你可以在使用字节码操作库加载引用类时替换对移动类的引用。