小程序有时会自动关闭
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也许这些更改之一会影响您的安全管理器侧步?
【讨论】:
以上是关于小程序有时会自动关闭的主要内容,如果未能解决你的问题,请参考以下文章