当前位置:  开发笔记 > 编程语言 > 正文

检测Webstart是否启动应用程序的最佳方法是什么?

如何解决《检测Webstart是否启动应用程序的最佳方法是什么?》经验,为你挑选了2个好方法。

正如我在最近的问题中明确指出的那样,Swing应用程序在使用Sun Webstart启动程序(至少从Java SE 6开始)运行时需要显式调用System.exit().

我想尽可能地限制这个hack,我正在寻找一种可靠的方法来检测应用程序是否在Webstart下运行.现在我正在检查系统属性"webstart.version"的值是否为空,但我在文档中找不到任何保证,该属性应由未来的版本/替代实现设置.

有没有更好的方法(最好不要停止对webstart API的依赖?)



1> jla..:

当你的代码是通过javaws的推出,javaws.jar已加载,并且您不希望依赖于JNLP API类是可用的.您可以改为查看是否存在JNLP API类,而不是测试不保证存在的系统属性:

private boolean isRunningJavaWebStart() {
    boolean hasJNLP = false;
    try {
      Class.forName("javax.jnlp.ServiceManager");
      hasJNLP = true;
    } catch (ClassNotFoundException ex) {
      hasJNLP = false;
    }
    return hasJNLP;
}

这也避免了在编译时需要在类路径中包含javaws.jar.

或者,您可以切换到使用javaws.jar进行编译并捕获NoClassDefFoundError:

private boolean isRunningJavaWebStart() {
    try {
        ServiceManager.getServiceNames();
        return ds != null;
    } catch (NoClassDefFoundError e) {
        return false;
    }
}

使用ServiceManager.lookup(String)和UnavailableServiceException很麻烦,因为它们都是JNLP API的一部分.未记录ServiceManager.getServiceNames()以进行抛出.我们专门调用此代码来检查NoClassDefFoundError.


jnlp.jar就足够了,它可以在包含Java SE演示和示例的zip存档中找到.此JAR仅包含接口.它更好,因为javaws.jar包含整个实现,这是无用的,因为它已经由JRE提供但它不在类路径中(仅在引导路径中?).

2> Tom..:

使用javax.jnlp.ServiceManager检索webstart服务.如果可用,则在Webstart下运行.

见http://download.java.net/jdk7/docs/jre/api/javaws/jnlp/index.html


@ddimitrov,你为什么要避免反思?如果你得到`ServiceManager`的`ClassNotFoundException`,你知道你不是*在JWS下运行.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有