Comment charger des jars dynamiquement?

Comment charger des jars dynamiquement? - Java - Programmation

Marsh Posté le 23-09-2003 à 23:34:18    

Le but etant de les ajouter au classpath.  
je m'explique, je veux crée un repertoire "plugins" dans lequel il y aurai des jars qui pourrons etre appelé via le prog principal ( un peu comme ANT en fait , il suffis d'ajouté un librairie dans ANT/lib pour qu'elle soit automatiquement prise en compte...)
greg m a suggéré de regarder ici , le prob c'est que ca fait pas ce que je veux ou alors je m'y prend mal :/
 
 
quelqu'un a peut etre deja developpé ce genre de chose  :whistle:  
 
 
merci de votre aide


Message édité par veryfree le 24-09-2003 à 00:17:35
Reply

Marsh Posté le 23-09-2003 à 23:34:18   

Reply

Marsh Posté le 23-09-2003 à 23:37:52    

jarclassloader c'est facile à utiliser et ça fait ce que tu veux, en fait c'est tout trouvé :heink: , same player shoot again  :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 23-09-2003 à 23:42:03    

bin oui [:spamafote]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 23-09-2003 à 23:51:24    

ben je pensait aussi mais non.
 
si je fait  
 

Code :
  1. URL url = new URL("jar:file:/" + plugins + "!/" );
  2. JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
  3. for (Enumeration e = jarConnection.getJarFile().entries(); e.hasMoreElements() ;) {
  4.            System.out.println(e.nextElement());
  5.        }


ici ,il m'affiche toute les entrées du jar mais impossible d'instancier un objet de l'archive :o

Reply

Marsh Posté le 23-09-2003 à 23:57:08    

bein où c'est que t'as vu que JarURLConnection était un class loader?  :heink:  
 
au pire si tu veux vraiment utiliser cette classe, tu extrait les .class avec elle et tu les load avec ClassLoader, et basta.


Message édité par schnapsmann le 23-09-2003 à 23:57:30

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 23-09-2003 à 23:59:34    

SchnapsMann a écrit :

bein où c'est que t'as vu que JarURLConnection était un class loader?  :heink:  
 
au pire si tu veux vraiment utiliser cette classe, tu extrait les .class avec elle et tu les load avec ClassLoader, et basta.


 
avec quoi alors?
 
ton objet jarclassloader n'existe meme pas!
 

Citation :

jarclassloader c'est facile à utiliser et ça fait ce que tu veux, en fait c'est tout trouvé :heink: , same player shoot again  :o

Reply

Marsh Posté le 24-09-2003 à 00:00:26    

http://java.sun.com/docs/books/tut [...] oader.html
 
ah?  :whistle:


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 24-09-2003 à 00:13:35    


je persiste, il n'existe pas :o  


JApplet
JarEntry
JarException
JarFile
JarInputStream
JarOutputStream
JarURLConnection


 
trouve moi le lien vers la javadoc et on en reparle :o


Message édité par veryfree le 24-09-2003 à 00:15:42
Reply

Marsh Posté le 24-09-2003 à 00:20:39    

Utilie URLClassLoader gros boolay. Ca fait 2h que je te l'ai déjà dit :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-09-2003 à 00:23:25    

DarkLord a écrit :

Utilie URLClassLoader gros boolay. Ca fait 2h que je te l'ai déjà dit :o


 
j'ai essayé et ca marche toujours pas ton truc  
 
 :whistle:


Message édité par veryfree le 24-09-2003 à 00:25:25
Reply

Marsh Posté le 24-09-2003 à 00:23:25   

Reply

Marsh Posté le 24-09-2003 à 00:35:12    

veryfree a écrit :


 
j'ai essayé et ca marche toujours pas ton truc  
 
 :whistle:


 

Code :
  1. public static void main(String[] args) throws Exception {
  2.         File f = new File("log4j-1.2.5.jar" );
  3.         if (!f.exists()) {
  4.             System.out.println("FATAL: test lib not found" );
  5.             System.exit(-1);
  6.         }
  7.         URL testJar = f.toURL();
  8.         try {
  9.             Class.forName("org.apache.log4j.Logger" );
  10.             System.out.println("Should have thrown a NoClassDefFoundError" );
  11.         } catch (ClassNotFoundException e) {
  12.             System.out.println("The logger objet was not found" );
  13.         } catch (Exception e) {
  14.             e.printStackTrace();
  15.         }
  16.         URLClassLoader myClassLoader = new URLClassLoader(new URL[]{testJar});
  17.         try {
  18.             Class.forName("org.apache.log4j.Logger" );
  19.         } catch (ClassNotFoundException e) {
  20.             System.out.println("The logger objet was not found after class loading" );
  21.         } catch (Exception e) {
  22.             e.printStackTrace();
  23.         }
  24.     }


 

Citation :


F:\>java -classpath . Test
The logger objet was not found
The logger objet was not found after class loading


 
:/


Message édité par darklord le 24-09-2003 à 00:47:10

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-09-2003 à 00:46:04    

pourtant ca devrait marcher
http://forum.java.sun.com/thread.j [...] ge=1525724


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-09-2003 à 01:15:00    

putain vous allez pas me faire chier à 1h30 du mat quand meme [:benou]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 01:18:49    

au fait faudrait ptet apprendre à lire un peu un lien hein
 
http://java.sun.com/docs/books/tut [...] oader.java
 
genre retourner au debut de la leçon ça mange pas de pain :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 01:20:59    

DarkLord a écrit :

pourtant ca devrait marcher


ben moi je trouverais ca bizare que ca marche : comment le Class.forName peut savoir qu'il doit utiliser le classloader que tu viens de créer ??  
avec ca ca dervait mieux marcher :

Code :
  1. Class.forName("org.apache.log4j.Logger", myClassLoader );


 
j'ai regardé dans le doc : si tu indique pas le classloader, il utiliser le classloader qui a servit à charger la class courante => ici c'est le classloader system => ca ne peut pas marcher ...
 
[/quote]
For example, in an instance method the expression:  
Class.forName("Foo" )
 is equivalent to:  
  Class.forName("Foo", true, this.getClass().getClassLoader())[/quote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 01:22:50    


je vois pas l'intérêt de surcharger URLCLassLoader à la place de simplement l'utiliser  :heink:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 01:32:23    

package test.packalacon;
 
import java.net.URL;
import java.net.URLClassLoader;
import java.io.File;
import java.io.FileNotFoundException;
 
public class TestJarLoader {
    private static final String classname = "org.apache.log4j.ConsoleAppender";
 
    public static void main(String[] args) throws Exception {
        File f = new File("log4j.jar" );
        if (!f.exists()) {
            throw new FileNotFoundException("he ho tu te fous de qui..." );
        }
 
        URL url = f.toURL(); // j'aime bien le source de cette methode, notamment le nom d'une des methodes qui y est appelée :lol:
 
        URLClassLoader ucl = new URLClassLoader(new URL[] {url} );
        Class c = ucl.loadClass(classname);
        Object o = c.newInstance();
 
        System.out.println("o.getClass().getName() = " + o.getClass().getName());
    }
}

:hello:

Reply

Marsh Posté le 24-09-2003 à 01:33:15    

benou a écrit :


je vois pas l'intérêt de surcharger URLCLassLoader à la place de simplement l'utiliser  :heink:  

parce qu'ils y ajoutent 2 methodes à la con; en effet ça n'a aucun interet d'y *ajouter* ces methodes...
peu importe:)

Reply

Marsh Posté le 24-09-2003 à 01:34:50    

dans la methode loadClass de ClassLoader, y'a un truc qui me laisse perplexe, c'est le boolean "resolve"... je comprend pas à quoi ça sert, et la javadoc est on ne peut plus claire:

Citation :

resolve : If <tt>true</tt> then resolve the class

[:boidleau]

Reply

Marsh Posté le 24-09-2003 à 15:49:59    

j'essaye ca qd je peux :jap:

Reply

Marsh Posté le 24-09-2003 à 15:52:59    

the real moins moins a écrit :

dans la methode loadClass de ClassLoader, y'a un truc qui me laisse perplexe, c'est le boolean "resolve"... je comprend pas à quoi ça sert, et la javadoc est on ne peut plus claire:

Citation :

resolve : If <tt>true</tt> then resolve the class

[:boidleau]


T'as maté ce que faisait la méthode resolveClass ?

Citation :

protected final void resolveClass(Class c)
 
    Links the specified class. This (misleadingly named) method may be used by a class loader to link a class. If the class c has already been linked, then this method simply returns. Otherwise, the class is linked as described in the "Execution" chapter of the Java Language Specification.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 24-09-2003 à 15:53:04    

veryfree a écrit :

j'essaye ca qd je peux :jap:


sinon prend le code de dark : y a juste à rajouter le classloader créé en paramêtre du Class.forName ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 15:57:01    

benou a écrit :


sinon prend le code de dark : y a juste à rajouter le classloader créé en paramêtre du Class.forName ...

et le mien y marche hein [:mmmfff]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 15:57:40    

Taiche a écrit :


T'as maté ce que faisait la méthode resolveClass ?

ben ui mais je comprend pas :o
et puis ça delegue à une methode native donc c'est pas gagné pour comprendre plus...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 15:58:44    

the real moins moins a écrit :

ben ui mais je comprend pas :o
et puis ça delegue à une methode native donc c'est pas gagné pour comprendre plus...


Ba ça fait ce que fait un linker dans un compilo, je suppose [:spamafote] Maintenant, je saurais pas t'en dire plus mais demande à chrisbk, il a l'air de connaître ce genre de conneries :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 24-09-2003 à 15:59:02    

the real moins moins a écrit :

et le mien y marche hein [:mmmfff]


ouais, ca revient au même [:spamafote] ...  
c'était juste au cas où il est pas vu le pourquoi du darkbug ;)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 15:59:46    

Taiche a écrit :


Ba ça fait ce que fait un linker dans un compilo, je suppose [:spamafote] Maintenant, je saurais pas t'en dire plus mais demande à chrisbk, il a l'air de connaître ce genre de conneries :o

haaaaan mais jcomprend pas jte dis :sweat:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 16:00:53    

au fait, une fois que t'as fait le Class.forName ou le ClassLoader.loadClass, la classe est appelable "normalement", ou bien faut repasser par le classloader à chaque fois?
(Ou bien il faut "registrer" ton classloader non?)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 16:13:10    

benou a écrit :


sinon prend le code de dark : y a juste à rajouter le classloader créé en paramêtre du Class.forName ...


oui voila , je comptait faire un mix de vos deux reponses :)
 
 

Reply

Marsh Posté le 24-09-2003 à 16:13:33    

[:mmmfff]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 16:28:36    

the real moins moins a écrit :

au fait, une fois que t'as fait le Class.forName ou le ClassLoader.loadClass, la classe est appelable "normalement", ou bien faut repasser par le classloader à chaque fois?
(Ou bien il faut "registrer" ton classloader non?)


 
Ben, à mon avis, une fois qu'elle est chargée, elle est chargée, comme n'importe quelle autre classe. On va pas la charger 50 fois...
Bref, après on l'utilise "normalement"!

Reply

Marsh Posté le 24-09-2003 à 16:36:03    

El_gringo a écrit :


Ben, à mon avis, une fois qu'elle est chargée, elle est chargée, comme n'importe quelle autre classe. On va pas la charger 50 fois...
Bref, après on l'utilise "normalement"!


nan je pense pas moi ...  
<a vérifier mais je suis quasi sûr>
quand tu rentres dans une classe A, elle charge les classes pour lesquelles y a des références dans la classe A. ex : si A fait référence à B, C, D. Ca va executer le code
A.getClass().getClassLoader().loadClass("B" );
A.getClass().getClassLoader().loadClass("C" );
A.getClass().getClassLoader().loadClass("D" );
 
donc ca va utiliser le classloader qui a servit à loader la classe.
</a vérifier mais je suis quasi sûr>
Donc si ce qui est au dessus est vrai, y a aucune raison que dans la suite de ton programme la classe du jar chargée dynamiquement soit connu par les classes de ton prog.
Par contre si cette classe (chargée dynamiquement) fait référence à des classes d'autres jars (indiqué dans le tableau d'URL) chargés par le même classloader, elle pourra les trouver.
 
edit : en fait je m'aperçoit que j'ai mal comprit ce que tu disais gringo : ouais la classe on peut l'utiliser comme n'importe quelle classe. C'est si on veut instancier un nouvel object de la même classe qu'il faudra réutiliser le classloader


Message édité par benou le 24-09-2003 à 16:37:30

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 16:44:02    

ouais enfin sauf que le class.forName ou le CL.loadClass n'instancie pas la classe ;)
 
y'a pas un truc pour "registrer" un classLoader dans la hierarchie des classloaders existants?
 
bon y'a moyen de setter un parent a mon classloader, mais pas l'inverse, donc si je comprend bien, je devrais *tjs* repasser par mon classloader maison pour charger un truc, pas moyen que ça se fasse tout seul...


Message édité par the real moins moins le 24-09-2003 à 16:50:11

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 16:47:27    

the real moins moins a écrit :

ouais enfin sauf que le class.forName ou le CL.loadClass n'instancie pas la classe ;)


 :??: j'ai jamais dit ca  

the real moins moins a écrit :


y'a pas un truc pour "registrer" un classLoader dans la hierarchie des classloaders existants?  


Si ce que j'ai dit au dessus est vrai ca ne changerai rien : la hierarchie des classloader se fait d'elle même en fonction du classloader qui a chargé les classes


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-09-2003 à 18:52:40    

en fait je me suis peut etre mal exprimé mais ce class.forName() ne correspond pas a ce que je veux faire , en effet lorsque je dev mon plugin j'ai acces a ce fichier jar ,donc je peux faire par ex:
 
import bidule.machin.RE;
 
Re reg = new RE("bla" );
 
le probleme, c'est que lorsque je vais lancé mon prog qui va appelé le plug in , le jar ne pourra pas se trouvé dans le classpath puisque celui doit etre défini dans la ligne de commande et que le plug in est chargé dynamiquement...
 
désolé si c'est pas tres clair , mais en gros le jar doit etre mis a la volé dans le classpath , et l'instanciation des objets qu'il contiens pourras se faire de facon standard ...

Reply

Marsh Posté le 24-09-2003 à 18:59:15    

bin tu dois charger ton jar avant meme d'invoquer quoi que ce soit sur l'objet sinon tu vas te manger une erreur si tu as des
 
import LaClassACharger
 
S.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-09-2003 à 19:16:09    

je crois que le veryfree y'a un ptit truc qui lui a echapé dans son idée de plugin là  [:core 666]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-09-2003 à 19:20:14    

the real moins moins a écrit :

je crois que le veryfree y'a un ptit truc qui lui a echapé dans son idée de plugin là  [:core 666]  


 
+1


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-09-2003 à 19:24:25    

expliquez moi alors je vous prie , je suis la pour apprendre moi  :o

Reply

Marsh Posté le 24-09-2003 à 19:34:17    

ben t'auras une interface Plugin, probablement. Tu vas vouloir en loader dynamiquement des implementations.
 
Tu vas pas coder en dur dans ton soft TrucPlugin tp = new TrucPlugin();
 
...
par contre dans ton plugin tu pourrais utiliser d'autres classes du jar sans probleme.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed