|
||
![]() |
|
![]() |
|
Table of Contents
Utiliser JasperReports avec Eclipse RCP
L’utilisation de JasperReports dans une application RCP provoque des 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 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 JasperReportsIl 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); } |
||