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

Langage Java Discussion :

[ClassLoader]Charger les classes d'un Jar


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut [ClassLoader]Charger les classes d'un Jar
    Bonjour

    Après un repos bien mérité, me revoici dans mon projet.
    Seulement, j'ai un petit souci à vous soumettre.
    Supposons que j'ai un Jar. Supposons aussi que j'ai un autre code Java dit "principal" qui veut charger les classes de Jar. Le tout est codé sous la norme Java5.
    Or, voici la méthode que j'utilise pour charger les classes de mon Jar:
    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 void scanning() throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException{
     
    		for(String s : this.returned){
    			String dir = System.getProperties().getProperty("user.dir")+"/Plugins/"+s+"/Jar/";
    			File directory = new File(dir);
    			File[]jars = directory.listFiles();
    			java.util.jar.JarFile jar = new java.util.jar.JarFile(jars[0]);
    			java.util.jar.JarEntry je = jar.getJarEntry("META-INF/services/com.bioxpr.Pluginnable");
    			InputStream is = jar.getInputStream(je);
    			byte[] buffer = new byte[1024];
                int len;
     
                Vector<String>lines = new Vector<String>();
                while((len = is.read(buffer)) >= 0){
                	lines.add(new String(buffer, 0, len));
                }
                is.close();
     
                URLClassLoader loader = new URLClassLoader(new URL[] { jars[0].toURL() });
                Class.forName(lines.get(0) , true, loader);
    		}
     
    	}
    Or, bien que tout semble bien aller, je me pogne malgré tout une ClassNotFoundException, relative à la ligne Class.forName(lines.get(0) , true, loader).
    Or, lines.get(0) contient bien le nom de la classe que je veux charger et l'URLClassLoader semble bien initialisé.
    Ai-je oublié quelque chose ?

    Merci d'avance de vos suggestions.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Trois remarques :
    1. La méthode toURL() de la classe File peut donner des résultats incorrects avec certains caractères... il vaut mieux utiliser toURI().toURL()

    2. Penses à utiliser un try/finally pour la fermeture du flux

    3. Vérifie la valeur de lines.get(0) : tu ne lis pas ton fichier ligne par ligne mais par bloc de 1024 octets... Pour te simplifier le tout tu peux englober ton flux dans un BufferedReader et utiliser la méthode readLine()...


    a++

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    Salut adi

    Merci à toi, je vais corriger en ce sens
    Tank you !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 892
    Par défaut
    A noter pour conclure cet excellent article de JavaWorld qui m'a aidé à parfaire mon code avec l'aide du remarquable adiGuba : http://www.javaworld.com/javaworld/j...javatip70.html

    En espérant que ça en aide d'autres.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Sa ressemble a ce que j'essaie de faire... je veux charger des drivers SQL qui ne sont pas dans le classpath.

    Je vais m'inspirer de ton code...

    Merci ^^

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    falais juste rajouter deux ligne a mon code :

    URLClassLoader loader = new URLClassLoader(new URL[]{new File(jar.getName()).toURI().toURL()});
    Class.forName(name , true, loader);

    et sa c'est fait comme qui dirai ^^

    Edit: la class ce charge correctement mais pas de Driver charger dans driverManager... je cherche !

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

Discussions similaires

  1. Inclure les classes d'un jar dans un war
    Par Krishtov dans le forum Maven
    Réponses: 7
    Dernier message: 09/02/2012, 15h19
  2. Charger les classes d'un Jar incluses dans un Jar
    Par daronmaster dans le forum Général Java
    Réponses: 2
    Dernier message: 08/06/2009, 22h11
  3. [Jar] Lister les classes d'un Jar
    Par GLDavid dans le forum Langage
    Réponses: 8
    Dernier message: 13/02/2007, 13h52
  4. [ClassLoader] Charger une classe extérieure au projet dynamiquement
    Par tiboudchou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/01/2007, 14h19
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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