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

Eclipse Java Discussion :

[ClassLoader] Upload de jar + chargement de classe contenu dans ce jar


Sujet :

Eclipse Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Par défaut [ClassLoader] Upload de jar + chargement de classe contenu dans ce jar
    Bonjour,

    Je suis en train d'essayer de mettre un point un système d'upload d'un JAR qui permet de charger une classe - contenue dans le jar - dans la WebApp courante.

    Pour cela je me suis servi comme base de la classe FileClassLoader de Jack Harich (trouvée sur javaworld) que j'ai modifié.

    Donc le principe upload à travers struts -> sauvegarde dans le fichier <web-app>/WEB-INF/extlib/<session-id>.jar

    Puis lecture des octets du fichier class à travers le fichier Jar.
    Voici le code de la méthode de FileClassLoader qui permet de lire le tableau de byte avant l'appel à defineClass
    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
     
    protected byte[] loadClassBytes(String className) {
     
      className = formatClassName(className);
      byte result[];
      String fileName = filePrefix + className;
      try {
        ZipFile zipFile = new ZipFile(filePrefix);
        ZipEntry entry = zipFile.getEntry(className);
        InputStream inStream = zipFile.getInputStream(entry);
        result = new byte[inStream.available()];
        inStream.read(result);
        inStream.close();
        return result;
      }
      ...
    Mais voilà quand j'appelle la méthode chargement j'ai l'erreur suivante :
    java.lang.ClassFormatError: com/SimpleTest (Illegal constant pool index)
    Donc pour tester j'ai mis directement le jat dans WEB-INF/lib et là j'ai accès sans problème à la classe. J'en conclu que c'est certainement la lecture à travers le Zip qui me pose problème...

    Avez vous une idée ? Ou une autre classe pour faire cela ....

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    Tu pourrais essayer en utilisant la classe JarFileau lieu de ZipFile.
    Ce ne sont pas les mêmes formats...

  3. #3
    Membre émérite
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Par défaut
    tu devrais essayer avec un getresourceasStream.

    Class.getResourceAsStream("foo/bar/myimg.jpg"));

    Ensuite tu dois le charger ds la JVM avec le classloader de ton appli.


    C'est fait pour.

  4. #4
    Membre expérimenté
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Par défaut
    Citation Envoyé par dude
    Tu pourrais essayer en utilisant la classe JarFileau lieu de ZipFile.
    Ce ne sont pas les mêmes formats...
    Euh tu es sûr de ce que tu dis ??? Je suis quasiment (il faut toujours une place au 1% de doute possible) sûr que c'est le même format : pour preuve il m'arrive régulièrement d'utiliser winzip en lieu et place de "jar".

    RanDomX je ne cherche pas à charger une ressource depuis un jar, je cherche à uploader une librairie depuis une WebApplication puis immédiatement a charger une classe contenue dans cette librairie (qui au passage n'est pas dans WEB-INF/lib mais dans WEB-INF/extlib. quoique même si elle avait été mise dans WEB-INF/lib le WebAppClassLoader a déja chargé les librairies).

    Bien en fait j'ai trouvé : il fallait utiliser URLClassLoader. Voici le bout de code d'une action Struts qui permet de faire ca (il n'y a pas UploadForm qui contient un attribut FormFile et une String):
    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
     
    public class UploadAction extends Action {
      public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        String realPath = getServlet().getServletConfig().getServletContext().getRealPath("WEB-INF/extlib");
        UploadForm f = (UploadForm) form;
        InputStream is;
        // Sauvegarde de la sortie
        is = f.getFile().getInputStream();
        byte[] ba = new byte[is.available()];
        is.read(ba);
        String path = realPath+"/"+request.getSession().getSessionId()+".jar";
        FileOutputStream fos = new FileOutputStream(path);
        fos.write(ba);
        fos.close();
        is.close();
        // Chargement de la classe
        File file = new File(path);
        URL url;
        url = file.toURL();
        URLClassLoader loader = new URLClassLoader(new URL[] { url });
        Class clazz = loader.loadClass(f.getClassName());
        Object tb = clazz.newInstance();
        ...
    }
    Voilà tout simple.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 37
    Par défaut ClassLoader pour un plugin ECLIPSE ?
    Bonjour

    je demande est ce que je peux exécuter mon plugin sous forme de 4 fichiers jar en utilisant le classLoader ?

    Merci de préciser comment

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Jar] Accéder à un fichier contenu dans le jar
    Par GLDavid dans le forum Langage
    Réponses: 9
    Dernier message: 31/10/2006, 14h30
  2. Réponses: 6
    Dernier message: 29/07/2005, 11h12
  3. [Plugin][Jar] Chargement fichier de conf d'un jar
    Par vberetti dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 29/06/2005, 14h03
  4. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  5. [JAR] instancier une Image contenue dans un jar
    Par celine31 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2005, 15h55

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