我运行一个打包在A.jar中的java应用程序,其中使用了B.jar中的一些类。
所有相关的jar都放在一个特定的目录中,该目录包含在类路径中。
程序是这样的:
main(){
run method ClassA.M1() in A.jar; //the method may keep running for 2 minutes
do some other prepare;
call method ClassB.M2 in B.jar;
}
当程序运行M1时,我用新版本手动替换了B.jar(名称也是B.jar)。
但是,该程序抛出ClassNotFoundException。
然后,再次启动程序,它运行正常。
所以,我的问题是:为什么抛出ClassNotFoundException,因为jar路径和jar名称没有改变,类加载器应该加载它而没有任何麻烦。
请给我一些指示。
答案 0 :(得分:1)
您不能简单地在运行时更改jar文件,方法是将它们替换为具有相同名称的jar文件,因为类加载器可能已经从中加载了一些类。
如果您需要支持此类行为,则需要查看将提供热替换机制的库或框架。
以下两篇文章可以帮助您更好地理解类加载器:
关于这个主题还有更多的文章,甚至关于Stack OverFlow的相关问题,我建议你阅读更多。