#1 Le 10/09/2007, à 10:57
- fjeannet
[java] Résolution d'une classe dans un classloader perso
Bonjour,
dans le but de pouvoir libérer une library dynamique (.so) utilisée d'un plugin java, j'ai développé un class loader maison.
Il fonctionne parfaitement tant qu'il n'est pas question d'héritage dans le plugin.
J'obtiens une erreur quand je lance un plugin dont une des classes possède une superclasse.
voici le code du ClassLoader (c'est un mélange d'un code récupéré sur le forum, et d'un autre dans la FAQ de developpez.com) :
[...]
public void init () throws Exception{
File fichier;
String tmp;
JarFile jar;
Enumeration enumeration;
Class tmpClass;
tmpClass = null;
tmp = new String ();
fichier = new File (engineListManager.getPath(designation));
jar = new JarFile(fichier.getAbsolutePath());
enumeration = jar.entries();
while(enumeration.hasMoreElements()){
tmp = enumeration.nextElement().toString();
//On vérifie que le fichier courant est un .class (et pas un fichier d'informations du jar )
if(tmp.length() > 6 && tmp.substring(tmp.length()-6).compareTo(".class") == 0) {
tmpClass = loadThisClass(jar, tmp);
if (tmpClass != null) {
for(int i = 0 ; i < tmpClass.getInterfaces().length; i ++ )
if(tmpClass.getInterfaces()[i].getName().toString().equals("engines.EnginePlugin") )
pluginClass = tmpClass;
}
}
}
}//end of method
public Class loadThisClass (JarFile archive, String fileName ) throws IOException {
Class classe;
String nomFormatte;
System.out.println("fichier = " + fileName);
JarEntry entry = archive.getJarEntry(fileName);
if (entry != null) {
byte[] contents = new byte[(int)entry.getSize()];
DataInputStream stream = new DataInputStream(archive.getInputStream(entry));
stream.readFully(contents);
nomFormatte = fileName.substring(0,fileName.length()-6).replace('/', '.');
System.out.println("Nom formatté : " + nomFormatte + "\n");
classe = defineClass(nomFormatte, contents, 0, contents.length);
resolveClass(classe);
return classe;
} else return null;
}//end of method
public void finalize() throws Throwable {
System.out.println("finalize du EnginePluginLoader");
super.finalize();
}//end of method
/**
* Retourne une instance de EnginePlugin
* @return EnginePlugin
*/
public EnginePlugin loadPlugin () {
try {
return (EnginePlugin) pluginClass.newInstance();
} catch (Exception e) {
System.out.println("Impossible de charger le moteur " + designation);
e.printStackTrace();
return null;
}
}//end of method
[...]
Voici le message d'erreur que j'obtiens :
java.lang.NoClassDefFoundError: engine/JeuDeParametres
Je pense qu'il s'agit d'un problème de résolution de classe, mais je n'ai aucune idée de la façon dont ça fonctionne.
Si qqun peut me filer un coup de main
Dernière modification par fjeannet (Le 24/09/2007, à 07:32)
Hors ligne
#2 Le 13/09/2007, à 08:29
- GrInDcOrE
Re : [java] Résolution d'une classe dans un classloader perso
Bonjour,
l'erreur est-elle à la compilation ou à l'exécution ?
Quelle est la ligne de code de l'erreur ?
Hors ligne