1

我运行一个打包在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 名称没有改变,类加载器应该加载它没有任何麻烦。

请给我一些指示。

4

1 回答 1

1

您不能在运行时通过将 jar 文件替换为具有相同名称的文件来简单地更改它们,因为类加载器可能已经从中加载了一些类。

如果您需要支持此类行为,则需要研究可提供热替换机制的库或框架。

这里有两篇文章可以帮助你更好地理解类加载器:

Stack OverFlow 上有很多关于这个主题的文章,甚至还有相关的问题,我建议你阅读更多。

于 2013-01-15T13:50:33.317 回答