URLClassLoader et FilePermisson

URLClassLoader et FilePermisson - Java - Programmation

Marsh Posté le 21-10-2002 à 01:06:21    

Bonjour a tous,
 
Toujours dans mon projet d'agent mobile, je rencontre des problemes pour charger dynamiquement un nouvel agent qui arrive sur la plate-forme.
 
Je pensais proceder comme ca :
 
- Mettre le .jar ou .class dans un repertore c:\X,  puis utiliser la class URLClassLoader pour charger mon agent ( puis deserialisation puis lancement de l'agent par ( .start() ).
 
J'en suis a faire des tests prealables, pour voir si c'est viable comme technique :  
 
Bin ca marche pas :kaola:, ou alors pas aussi simplement   :
 

Citation :

Exception in thread "main" java.lang.IllegalAccessError: class Agent cannot acce
ss its superinterface Testable
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
        at SimpleClassTester.main(SimpleClassTester.java:19)


 
La class Agent est donc dans le repertore c:\X, lors de la compilation le serveur d'acceuil ne possede que l'interface qu'implemente agent ( interface Testable). La classe agent est compile a l'aide du meme interface ( Testable en l'occurence).
 
J'ai essaye de jouer avec les "FilePermission" en read en execute en tout ce que tu veux mais ca n'a pas eu d'effet.
 
Y aurait-il un pro du classloader dans le coin  ;) ?

Reply

Marsh Posté le 21-10-2002 à 01:06:21   

Reply

Marsh Posté le 21-10-2002 à 08:29:58    

de quelle façon est ce que tu sérialize ton agent ?  
 
Logiquement, pour faire ce que tu veux, tu soit transmettre le bytecode java de la classe en plus de l'état de l'agent.
 
Il faut ensuite que ton serveur lise ce bytecode, et utilise la méthode defineClass(String name, byte[] b, int off, int len) du ClassLoader pour charger l'objet Class correspondant. Ensuite tu fais un newInstance, tu recharge l'état, tu créés un thread à qui tu balance l'état de l'agent et la classe ou ca roule !
 
maintenant, tu risques d'avor des problème si tu veux pouvoir modifier le code d'implémentation de ton agent côté client et l'envoyer une 2e fois sur ton serveur. Dans ce cas là, je crois qu'il faut que tu gères ton propre ClassLoader et ca je sais pas trop comment ca fonctionne ...

Reply

Marsh Posté le 21-10-2002 à 08:31:48    

je connaissait pas la class URLClassLoader. intéressant !  
 
tu es sur de ne pas avoir mélangé l'état de l'agent avec sa classe ?

Reply

Marsh Posté le 21-10-2002 à 08:45:11    

l'exception que tu te manges est assez surprenante : elle est même pas documentée dans la javadoc.
 
Tu pourrais montrer ton code d'encodage de l'agent et de rechargement de l'agent par le serveur ?

Reply

Marsh Posté le 21-10-2002 à 18:20:02    

Hm, en fait toute la partie transfert du jar, serialisation de l'agent n'est pas encore faite.
 
Je suis actuellement en train de tester les differentes possibilites ( enfin plutot moyen de faire ce que je veux).
 
J'ai trouvé l'URLClassLoader dans un bouquin: "Java et Internet" de chez Vuibert et pour eux ca marchait bien....mais il devait surement utiliser une version plus ancienne (j'utilise 1.4...)!
 

Citation :

maintenant, tu risques d'avor des problème si tu veux pouvoir modifier le code d'implémentation de ton agent côté client et l'envoyer une 2e fois sur ton serveur. Dans ce cas là, je crois qu'il faut que tu gères ton propre ClassLoader et ca je sais pas trop comment ca fonctionne ...


 
Je ne pense pas pour le moment modifier le code de mon agent, je me contenterais de la serialisarion pour modifier son comportement.
 

Citation :

Il faut ensuite que ton serveur lise ce bytecode, et utilise la méthode defineClass(String name, byte[] b, int off, int len) du ClassLoader pour charger l'objet Class correspondant


 
Je vais plutot essayer cette methode ( la methode classique en fait) en esperant qu'elle marche)....enfin, URLCLassLoader me semblait quand meme bien pratique :( !
 
Il allait meme m'extraire les .class des .jar et surement resoudre les problemes de dependances....je vais quand meme creuser encore un peu ces histoires de securité c'est trop bete  :cry:  :cry: !!
 

Reply

Sujets relatifs:

Leave a Replay

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