【问题标题】: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

标签: java nullpointerexception java-7


【解决方案1】:

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

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

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

【讨论】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2016-07-09
    相关资源
    最近更新 更多