我的java应用程序发生了非常奇怪的事情。总之,问题是它有时会在30-60秒的工作后自行关闭。
具体情况如下:
应用程序实际上是在applet设置中启动的,applet加载主应用程序jar,将其保存到磁盘,然后通过反射启动实际程序。 applet 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);
只有当applet通过Citrix
连接到终端服务器运行时才会发生崩溃。
如果在启用了java控制台且trace
选项的情况下运行applet,我会在关闭之前看到以下消息:
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
启动关闭挂钩后,应用程序似乎仍在运行,我在日志中看到如下例外:
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似乎不是一种选择。
我完全迷失在这里。有人至少可以给我一些关于解决这个问题的建议吗?可能是什么原因?有办法解决这些问题吗?
答案 0 :(得分:1)
首先,我希望您在运行之前正确验证下载的应用程序(通过SSL下载或通过使用数字签名进行验证,在这种情况下您可以对jar进行签名)。
解决问题。这可能很容易,因为你正在applet JVM中运行。 applet jvm的生命周期由浏览器决定。因此,如果您仍想使用applet作为启动程序,则在applet子类的Applet.destroy()
,Applet.stop()
方法中插入一些调试输出,看看它是否与关闭有关。
另一种解决方案可能是使用Java Webstart启动它。它确实是从网上启动Java应用程序的最佳方式。
答案 1 :(得分:0)
覆盖安全管理器:这是否意味着您实际上回避整个Java applet安全概念?发布一个禁用安全管理器的applet,然后加载另一个应用程序听起来像非常糟糕的主意给我,特别是如果你没有像Java applet那样多的安全检查。如果有人设法抓住这个applet,他们可能会使用它从他们自己的网站加载漏洞利用代码,你可能会撤销你的证书。
围绕Java 7u7,修复了一个主要的安全问题:
但它在7u7尚未完全修复:
事实上,还有另一个尚未解决的问题:
这些更改中的一个可能会影响您的安全管理员端步骤吗?