Was ist der beste Weg, um festzustellen, ob eine Anwendung von Webstart gestartet

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

  •  03-07-2019
  •  | 
  •  

Frage

Wie es in meinem deutlich gemacht, letzte Frage , Swing-Anwendungen müssen explizit System.exit () aufrufen, wenn sie lief die Sonne Webstart Launcher (zumindest von Java SE 6) verwendet wird.

Das mag ich so viel wie möglich beschränken hacken und ich bin auf der Suche nach einem zuverlässigen Weg, um festzustellen, ob die Anwendung unter Webstart läuft. Im Moment bin ich prüfen, ob der Wert der Systemeigenschaft „webstart.version“ nicht null ist, aber ich konnte keine Garantien in der Dokumentation, dass diese Eigenschaft sollte durch zukünftige Versionen / alternative Implementierungen eingestellt werden.

Gibt es eine bessere Art und Weise (vorzugsweise solche, die keine Abhängigkeit von der die webstart API ceate?)

War es hilfreich?

Lösung

Wenn Ihr Code über javaws gestartet wird, javaws.jar wird geladen und die JNLP-API-Klassen, die Sie wollen nicht auf verfügbar sind abhängig zu sein. Statt die Prüfung für eine Systemeigenschaft, die existiert nicht garantiert ist, könnten Sie stattdessen sehen, ob eine JNLP API-Klasse vorhanden ist:

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

Dies auch javaws.jar auf Ihrem Klassenpfad enthalten vermeidet, um beim Kompilieren.

Alternativ schalten Sie könnten mit javaws.jar zu kompilieren und zu kontrollieren NoClassDefFoundError statt:

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

Mit ServiceManager.lookup (String) und UnavailableServiceException sind Schwierigkeiten, weil beide Teil der JNLP API sind. Die ServiceManager.getServiceNames () nicht zu werfen dokumentiert. Wir werden diesen Code speziell fordern eine NoClassDefFoundError zu überprüfen.

Andere Tipps

Mit der javax.jnlp.ServiceManager einen webstart Dienst abzurufen. Wenn es availabe ist, werden Sie unter Webstart ausgeführt wird.

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

Wie Sie erwähnt haben, das System-Eigenschaft überprüfen, wie folgt, ist wahrscheinlich die sauberste Weg:

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

In einem Produktionssystem habe ich die obige Technik seit Jahren verwendet.

Sie können auch zu sehen, versuchen, zu überprüfen, ob es irgendwelche Eigenschaften sind, die mit „jnlpx.“ aber keiner von denen ist wirklich „garantiert“, dort zu sein, entweder so weit ich weiß.

Eine Alternative könnte den Downloadservice wir vorgeschlagen von Tom zu versuchen sein zu instanziiert

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

Natürlich, die den Nachteil haben, Ihren Code zu dieser API zu koppeln.

Ich habe keine wirkliche Erfahrung mit Java Web Start andere als wieder es ein paar Jahre.

Wie wäre es Ihre Anwendung mit einem Parameter zu starten, die Sie definieren, als Sie festgelegt, wenn die App über Java Web Start gestartet wird.

Wenn Sie in Argumente, um Ihre Anwendung übergeben möchten, müssen Sie sie auf die Start-up-Datei hinzufügen (aka JNLP Deskriptor) mit oder Elemente.

Dann überprüfen, um zu sehen, ob diese Eigenschaften festgelegt sind.

Auch dies ist ein Vorschlag, den ich nicht für JWS codiert haben, und es kann nicht so einfach sein.

Sie können prüfen, ob die aktuelle Classloader ist eine Instanz com.sun.jnlp.JNLPClassLoader (Java Plugin 1) oder sun.plugin2.applet.JNLP2ClassLoader (Java Plugin 2). Trotz des „Applet“ -Paket, ein Applet JNLP mit dem Java-Plugin mit 2 verwendet eine andere Klassenlader, sun.plugin2.applet.Applet2ClassLoader. Es arbeitet mit OpenJDK zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top