小程序有时会自动关闭

Posted

技术标签:

【中文标题】小程序有时会自动关闭【英文标题】:Applet automatically closes sometime 【发布时间】:2012-11-16 12:31:24 【问题描述】:

我的 java 应用程序发生了非常奇怪的事情。总而言之,问题在于它有时会在工作 30-60 秒后自行关闭。

具体情况如下:

应用程序实际上是在小程序设置中启动的,小程序加载主应用程序jar,将其保存到磁盘,然后通过反射启动实际程序。小程序 jar 已签名,应用程序 jar 未签名,因此我不得不覆盖安全管理器。代码如下:

System.setSecurityManager(new SecurityManager() 
   @Override public void checkPermission(Permission p) 
);
URLClassLoader loader = new URLClassLoader(new URL[] mainJarFile.toURI().toURL(), this.getClass().getClassLoader());
Class<?> app = Class.forName("launch.App", true, loader);
Method start = app.getDeclaredMethod("start", URL.class, URL.class);
start.invoke(app.newInstance(), codeBase, documentBase);

只有当小程序通过Citrix 连接到终端服务器运行时才会发生崩溃。

事实上,崩溃并不是崩溃。在日志文件中,我看到关机钩子在正常关机期间启动和完成。

如果小程序在 java 控制台可见且 trace 选项打开的情况下运行,我会在关机前看到以下消息:

security: JSS is not configured
network: Connecting https://javadl-esd-secure.oracle.com/update/baseline.version with proxy=HTTP @ FWR200/192.168.0.246:8080

shutdown hook 启动后,应用程序似乎仍在运行,我在日志中看到如下异常:

2012.11.13 16:20:07.171 | def.pR.run:1639 | class java.lang.NullPointerException : null
    sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
    java.security.AccessController.doPrivileged(Native Method)
    sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
    sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)        
    ... // so on, the exception seems to happen in completely regular app code

最后,直到那些 Citrix 服务器开始使用 Java 7(特别是 java 7 更新 9)而不是 Java 6,才出现此类问题。降级 java 似乎不是一种选择。

我完全迷路了。有人至少能给我一些关于解决这个问题的建议吗?可能是什么原因?有没有办法解决这些问题?

【问题讨论】:

“可能是什么原因?” 这可能是 JRE 中的错误。检查bug database,如果没有发现任何相关内容,请提出。 @AndrewThompson - 我应该在该数据库中查找哪些关键字? JRE 版本号可能是赠品。我也会加入NullPointerException 【参考方案1】:

首先,我希望您在运行下载的应用程序之前正确验证它(通过 SSL 下载它或使用数字签名验证它,在这种情况下您最好对 jar 进行签名)。

解决问题。这很可能是因为您在 applet JVM 中运行。 applet jvm 的生命周期由浏览器决定。因此,如果您仍想使用小程序作为启动器,请在小程序子类的Applet.destroy()Applet.stop() 方法中插入一些调试输出,看看是否与关闭有关。

另一个解决方案是使用 Java Webstart 启动它。这确实是从 Web 启动 Java 应用程序的最佳方式。

【讨论】:

我通过 Java Webstart 启动它。即使一开始它失败了,我也可以用很多 jvm 选项和东西来安装它,最后解决这个问题。此外,总体而言,JWS 提供了很多更多的灵活性。【参考方案2】:

覆盖安全管理器:这是否意味着您实际上回避了整个 Java 小程序安全概念?发布一个禁用安全管理器的小程序,然后加载另一个应用程序对我来说听起来是一个非常糟糕的主意,特别是如果您没有像 Java 小程序那样多的安全检查。如果有人设法抓住了这个小程序,他们可能会使用它从他们自己的网站加载漏洞利用代码,而您的证书可能会被吊销。

围绕 Java 7u7 修复了一个重大安全问题:

http://www.kb.cert.org/vuls/id/636312

但在 7u7 中还没有完全修复:

http://seclists.org/fulldisclosure/2012/Sep/170

事实上,还有一个尚未修复:

http://seclists.org/fulldisclosure/2012/Oct/155

也许这些更改之一会影响您的安全管理器侧步?

【讨论】:

以上是关于小程序有时会自动关闭的主要内容,如果未能解决你的问题,请参考以下文章

电脑有时会自动关闭所有的窗口是啥原因?

为啥我用VB写的小程序生成工程后打开后几秒就自动关闭了(如用V。有时候下载的一些软件业有类似的情况。

退到主界面微信小程序自动关闭怎么回事

为啥应用程序池会自动停止? [关闭]

c++程序运行后黑色小窗口自动关闭,怎么回事?

我的电脑窗口总是自动关闭