アプリケーションがWebstartによって起動されたかどうかを検出する最良の方法は何ですか

StackOverflow https://stackoverflow.com/questions/216315

  •  03-07-2019
  •  | 
  •  

質問

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

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

より良い方法はありますか(できれば、Webstart APIへの依存を止めない方法がありますか?)

役に立ちましたか?

解決

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

他のヒント

javax.jnlp.ServiceManagerを使用して、Webstartサービスを取得します。 使用可能な場合は、Webstartで実行しています。

http://download.java.netを参照/jdk7/docs/jre/api/javaws/jnlp/index.html

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

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

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

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

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

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

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

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

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

アプリに引数を渡したい場合は、または要素を使用して起動ファイル(別名JNLP記述子)に引数を追加する必要があります。

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

これは私がJWS用にコーディングしたことのない提案であり、簡単ではないかもしれません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top