Improve Foudations Improve Technologies Improve Community Improve Institute

Utiliser JasperReports avec Eclipse RCP

L’utilisation de JasperReports dans une application RCP provoque des NoClassDefFoundError ...
Cyril HUGER, 2006/01/24


Dans une application Eclipse RCP chaque plugin possède son propre classloader. Par défaut ce classloader ne donne accès qu’aux classes dudit plugin et aux classes exportées par les plugins dont il dépend. Pour fonctionner, JasperReports génère dynamiquement une classe représentant le Report. Puisque cette classe n’est pas connue du plugin, elle n’est pas chargée. Eclipse propose un mécanisme nommé “buddy loading” mais celui-ci n’est pas utilisable dans le cas de JasperReports. La solution consiste à définir un nouveau classloader.

Créer la classe JasperContextFinder

Notre classloader va être créé en dupliquant la classe org.eclipse.core.runtime.internal.adaptor.ContextFinder. Nous nommons cette classe JasperContextFinder et nous remplacons la méthode basicFindClassLoader par le code suivant :

ClassLoader basicFindClassLoader() {
	Class[] stack = contextFinder.getClassContext();
	for (int i = 1; i < stack.length; i++) {
		ClassLoader tmp = stack[i].getClassLoader();
		if (stack[i] != ContextFinder.class && tmp != null
				&& checkClassLoader(tmp)) {
			return tmp;
		}
	}
	return null;
}

Utiliser JasperReports

Il ne reste plus qu’a utiliser JasperReports avec notre classloader.

// Taking backup of the default classloader
ClassLoader systemClassLoader = Thread.currentThread().getContextClassLoader();
try {
	// Loading my custom classloader
	Thread.currentThread().setContextClassLoader(
		new JasperContextFinder(Thread.currentThread()
					.getContextClassLoader()));
 
	// Manipulation de Jasper
	...
	JasperPrint jasperPrint = JasperFillManager.fillReport(...);
	...
 
} finally {
	// Replacing my custom classloader with the original classloader.
	Thread.currentThread().setContextClassLoader(systemClassLoader);
}
 
moni/trucs/jasperreports_avec_eclipse_rcp.txt · Last modified: 2006/02/20 10:12 by fesnault