13

私の最近の質問で明らかになったように、Swing アプリケーションは、Sun Webstart ランチャー (少なくとも Java SE 6 以降) を使用して実行される場合、明示的に System.exit() を呼び出す必要があります。

このハッキングを可能な限り制限したいと考えており、アプリケーションが Webstart で実行されているかどうかを検出する信頼できる方法を探しています。現在、システム プロパティ「webstart.version」の値が null でないことを確認していますが、このプロパティが将来のバージョン/代替実装によって設定されるべきであるという保証をドキュメントで見つけることができませんでした。

より良い方法はありますか (できれば、webstart API への依存関係を作成しない方法でしょうか?)

4

5 に答える 5

11

コードが 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 をチェックするために、このコードを具体的に呼び出しています。

于 2013-04-24T19:40:30.617 に答える
5

javax.jnlp.ServiceManager を使用して、webstart サービスを取得します。利用できる場合は、Webstart で実行されています。

http://download.java.net/jdk7/docs/jre/api/javaws/jnlp/index.htmlを参照してください。

于 2008-10-19T12:08:25.557 に答える
4

おっしゃったように、次のようにシステム プロパティを確認するのがおそらく最もクリーンな方法です。

private boolean isRunningJavaWebStart() {
    return System.getProperty("javawebstart.version", null) != null;
}

本番システムでは、上記の手法を何年も使用してきました。

「jnlpx」で始まるプロパティがあるかどうかを確認することもできます。しかし、私の知る限り、それらのどれも実際にそこにあることが「保証されている」わけではありません。

別の方法として、Tom が提案した DownloadService のインスタンス化を試みることもできます。

private boolean isRunningJavaWebStart() {
    try {
        DownloadService ds = (DownloadService) ServiceManager.lookup("javax.jnlp.DownloadService");
        return ds != null;
    } catch (UnavailableServiceException e) {
        return false;
    }
}

もちろん、コードをその API に結合するという欠点があります。

于 2008-10-19T13:13:56.037 に答える
3

数年前にJavaWebStartを見る以外に、JavaWebStartの実際の経験はありません。

Java Web Startを介してアプリを起動するときに設定するよりも、定義したパラメーターを使用してアプリケーションを起動するのはどうでしょうか。

アプリに引数を渡したい場合は、or要素を使用してそれらをスタートアップファイル(別名JNLP記述子)に追加する必要があります。

次に、これらのプロパティが設定されているかどうかを確認します。

繰り返しますが、これは私がJWS用にコーディングしていない提案であり、これほど簡単ではないかもしれません。

于 2008-10-19T13:38:12.977 に答える
0

現在のクラスローダーが com.sun.jnlp.JNLPClassLoader (Java プラグイン 1) または sun.plugin2.applet.JNLP2ClassLoader (Java プラグイン 2) のインスタンスであるかどうかを確認できます。「アプレット」パッケージにもかかわらず、Java プラグイン 2 で JNLP を使用するアプレットは、別のクラスローダー、sun.plugin2.applet.Applet2ClassLoader を使用します。OpenJDK でも動作します。

于 2015-07-09T08:36:33.640 に答える