如何检测JVM是否在没有重新启动的情况下升级(在Windows上)?

我们经常从
Windows用户那里获得以下堆栈跟踪:

java.lang.UnsatisfiedLinkError: sun.awt.image.ImageRepresentation.setBytePixels(IIII[BIILsun/awt/image/ByteComponentRaster;I)V
    at sun.awt.image.ImageRepresentation.setBytePixels(Native Method)
    at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
    at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.sendPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.parseImage(Native Method)
    at sun.awt.image.GifImageDecoder.readImage(Unknown Source)
    at sun.awt.image.GifImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)

当用户升级Java,然后尝试运行我们的应用程序而不首先重新启动时会发生这种情况.显然,升级Java需要(像Windows上的其他所有内容一样)重新启动计算机以使事物恢复到可用状态.

这不是我们可以捕获的异常,因为我们的代码都不在调用堆栈中.我们可以从Thread.UncaughtExceptionHandler处理异常,这是我们现在正在做的事情.

我们希望有一种方法可以在启动时检查我们是否处于需要重新启动后的状态,直接导致此异常并捕获它,或者进行其他检查. (目前,我们还不知道甚至会触发这个……)有谁知道我们怎么会这样做?

最佳答案 我怕你运气不好.可能有一个注册表项让操作系统知道它需要重新启动,但只有在安装程序需要时才会设置.唯一的另一个例外是,如果存在使用DLL的代码,否则将由安装程序替换.安装过程将触发操作系统的“需要重启以完成”对话框.

我还没有Java自动更新要求我重新启动我的机器.如果操作系统永远不会处于“需要重启”状态,则无需查找和检查.您可以做的最好的事情是捕获异常并显示一个很好的错误消息.我会把这个问题报告给Oracle作为一个错误(男人很难习惯).也许未来的更新会表现得很好.

点赞