Quel est le meilleur moyen de détecter si une application est lancée par Webstart

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

  •  03-07-2019
  •  | 
  •  

Question

Comme cela a été précisé clairement dans mon question récente , les applications Swing doivent appeler explicitement System.exit () lorsqu’elles sont exécutées à l’aide du programme de lancement Sun Webstart (au moins à partir de Java SE 6).

Je souhaite limiter ce piratage autant que possible et je recherche un moyen fiable de détecter si l'application est exécutée sous Webstart. En ce moment, je vérifie que la valeur de la propriété système " webstart.version " n'est pas nul, mais je n'ai trouvé aucune garantie dans la documentation selon laquelle cette propriété devrait être définie par les futures versions / implémentations alternatives.

Existe-t-il de meilleurs moyens (de préférence, ceux qui ne créent pas de dépendance à l'API Webstart?)

Était-ce utile?

La solution

Lorsque votre code est lancé via javaws, javaws.jar est chargé et les classes de l'API JNLP sur lesquelles vous ne souhaitez pas dépendre sont disponibles. Au lieu de rechercher une propriété système dont l'existence n'est pas garantie, vous pouvez voir si une classe d'API JNLP existe:

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

Ceci évite également d'avoir à inclure javaws.jar dans votre chemin de classe lors de la compilation.

Vous pouvez également passer à la compilation avec javaws.jar et capturer NoClassDefFoundError à la place:

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

L'utilisation de ServiceManager.lookup (String) et UnavailableServiceException pose problème car les deux font partie de l'API JNLP. Le ServiceManager.getServiceNames () n'est pas documenté à lancer. Nous appelons spécifiquement ce code pour rechercher une erreur NoClassDefFoundError.

Autres conseils

Utilisez javax.jnlp.ServiceManager pour récupérer un service Webstart. S'il est disponible, vous utilisez Webstart.

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

Comme vous l'avez mentionné, la vérification de la propriété System comme suit est probablement la méthode la plus propre:

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

Dans un système de production, j'utilise la technique ci-dessus depuis des années.

Vous pouvez également essayer de vérifier s'il existe des propriétés commençant par "jnlpx". mais aucun de ceux-ci n'est réellement "garanti". être là autant que je sache.

Une alternative pourrait être d’essayer d’instancier le service de téléchargement proposé par Tom:

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

Bien sûr, cela a l'inconvénient de coupler votre code à cette API.

Je n'ai pas vraiment d'expérience avec Java Web Start, à part le regarder quelques années en arrière.

Pourquoi ne pas démarrer votre application avec un paramètre que vous définissez que vous définissez au démarrage de l'application via Java Web Start.

Si vous souhaitez transmettre des arguments à votre application, vous devez les ajouter au fichier de démarrage (descripteur JNLP) à l'aide d'éléments ou.

Vérifiez ensuite si ces propriétés sont définies.

Encore une fois, c’est une suggestion que je n’ai pas codée pour JWS et ce n’est peut-être pas si facile.

Vous pouvez vérifier si le chargeur de classes actuel est une instance de com.sun.jnlp.JNLPClassLoader (plug-in Java 1) ou de sun.plugin2.applet.JNLP2ClassLoader (plug-in Java 2). Malgré l'applet " " package, une applet utilisant JNLP avec le plug-in Java 2 utilise un autre chargeur de classes, sun.plugin2.applet.Applet2ClassLoader. Cela fonctionne aussi avec OpenJDK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top