Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

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