IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JWS Java Discussion :

[JWS] DownloadService.loadResource de jars hors JNLP


Sujet :

JWS Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut [JWS] DownloadService.loadResource de jars hors JNLP
    plusieurs questions à tiroirs (numérotées):

    Je déclare dans mon jnlp un seul jar contenant le main de l'application (main.jar). Lors de l'execution je récupère une liste de noms de jars (a.jar, b.jar...).
    Ensuite, en utilisant DownloadService.loadResource, je charge ces autres jars (depuis le même serveur). Tous les jar sont signés avec le même certificat!

    Au premier lancement tous les jars sont bien mis en cache (main.jar, a.jar, b.jar...). Lors des lancements ultérieurs, JWS vérifie la version de main.jar (déclaré dans le JNLP) en testant la date du fichier sur le serveur (c'est l'algo défini dans les spécifications jnlp). Il re-télécharge main.jar seulement si la date sur le serveur est supérieure à la date du fichier dans le cache. Ce fonctionnement est parfait pour moi: je ne gère pas les versions explicitement, si je mets à jour le jar sur le serveur, les clients se mettront à jour automatiquement. Pour les jars qui ne sont pas définis dans le JNLP (a.jar, b.jar...), DownloadService.loadResource ne teste pas la date sur le serveur. Du coup ces jars ne se mettent pas à jour automatiquement.

    première question:

    1- Est-t-il possible de dire au DownloadService de vérifier la date des ressources pour les comparer au cache et, le cas échéant les re-télécharger?

    ensuite:
    Avec ce mode de fonctionnement et avec un JRE 1.6.0_20, j'ai un message indiquant un problème de sécurité correspondant à ce cas: http://java.sun.com/javase/6/docs/te...ixed_code.html
    J'ai donc d'abord répondu "non" pour avoir le comportement ci-dessus.

    j'ai ensuite voulu faire en sorte d'enlever ce warning.
    Comme indiqué, J'ai donc ajouté l'attribut "Trusted-Only: true" dans le manifest de main.jar.
    Je vide mon cache JWS et relance mon JNLP.
    Là, plus de popup de warning mais une exception, lorsque je tente d'instancier une classe mon.package.A de a.jar après l'avoir chargé par DownloadService.loadResource (chargement qui semble fonctionner puisque j'ai bien a.jar dans mon cache JWS):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Exception in thread "**** Login thread" java.lang.SecurityException: Trusted-Only loader attempted to load sandboxed resource from http://monserveur/a.jar
    	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.check(Unknown Source)
    	at com.sun.deploy.security.CPCallbackHandler$ParentCallback.access$1400(Unknown Source)
    	at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(Unknown Source)
    	at com.sun.deploy.security.DeployURLClassPath$JarLoader.checkResource(Unknown Source)
    	at com.sun.deploy.security.DeployURLClassPath$JarLoader.getResource(Unknown Source)
    	at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at maltese.corto.login.CortoPanel$5.run(CortoPanel.java:348)
    	at java.lang.Thread.run(Unknown Source)
    d'où ma deuxième question:
    2- je fais sans doute quelque chose à l'envers mais quoi?

    J'ai ensuite fais le même test mais en ajoutant cette fois ci l'attribut "Trusted-Library: true" dans le manifest de mon main.jar. Je vide mon cache et relance et là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in thread "**** Login thread" java.lang.NoClassDefFoundError: mon/package/A
    	at maltese.corto.login.CortoPanel$5.run(CortoPanel.java:348)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: mon.package.A
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	... 2 more

    3- une piste???

    Je désespère un peu, j'ai l'impression que je ne suis pas loin mais je dois passer à coté de qqch...

    Merci d'avance pour vos réponses et désolé pour le pavé...

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bon alors j'ai trouvé une solution à mon second problème.
    De ce que j'ai compris:
    lorsque le champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <security> 
            <all-permissions/> 
    </security>
    est présent dans le JNLP alors cela donne toutes les permissions au JNLPClassLoader. lorsque DownloadService.loadResource() est utilisé, il charge les classes issues des jars externes dans un autre ClassLoader mais ce nouveau ClassLoader n'hérite pas des politiques de sécurité du JNLPClassLoader.
    Ma solution consiste à donner mes propres politiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Policy.setPolicy(getAllPermissionPolicy());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /**
        * @return a {@link Policy} with all permission granted
        */
       private Policy getAllPermissionPolicy()
       {
          Policy policy = new Policy() {
     
             private PermissionCollection m_permissionCollection;
     
             @Override
             public PermissionCollection getPermissions(CodeSource p_codesource)
             {
                return getAllPermissionCollection();
             }
     
             @Override
             public PermissionCollection getPermissions(ProtectionDomain p_domain)
             {
                return getAllPermissionCollection();
             }
     
             /**
              * @return an AllPermissionCollection
              */
             private PermissionCollection getAllPermissionCollection()
             {
                if (m_permissionCollection == null)
                {
                   m_permissionCollection = new AllPermission().newPermissionCollection();
                   m_permissionCollection.add(new AllPermission());
                }
                return m_permissionCollection;
             }
          };
          return policy;
       }
    C'est peut-être un peu la méthode de Conan le barbare mais ça fonctionne dans mon cas => plus de popup de warning!

    Pour le premier problème, j'ai créé une nouvelle discussion afin de ne pas mélanger les réponses: [JWS] Gestion du cache avec DownloadService.loadResource() de jars hors JNLP

Discussions similaires

  1. Exécution fichier jar hors connexion
    Par titi971 dans le forum Langage
    Réponses: 0
    Dernier message: 25/08/2012, 18h27
  2. Réponses: 0
    Dernier message: 03/06/2010, 14h15
  3. Utiliser JDT pour analyser un JAR hors projet
    Par hodac dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 10/05/2010, 17h26
  4. Relation entre .jar et .jnlp
    Par yayamo dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 27/01/2007, 17h48
  5. [JAR] lire un fichier dans un jar OU hors d'un jar
    Par yveslamand dans le forum Général Java
    Réponses: 13
    Dernier message: 25/04/2005, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo