Bonjour,
Voici le contexte de ma demande:
J'ai une application sous Spring 3.0.5 exécutée dans un Tomcat. je dois pouvoir exécuter des classes externes au projets, le but étant de pouvoir facilement ajouter/retirer des classes avec simplement un redémarrage de l'appli pour prise en compte.
Ces classes implémentent toutes une même Interface pour dynamiquement les exécuter, elles font appel à des manager de l'application.
1/ Dans la conf du Tomcat, j'ai ajouté le path vers le répertoire contenant les classes puis ai monté ces classes dans un manager du projet
Malheureusement ça ne fonctionne pas, mes classes externes n'ont pas la visibilité sur les classes de la webapp. Bilan l'interface IClasseExterne n'est pas reconnue, pas moyen d'utiliser les managers du projet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 @Autowired private Set<IClasseExterne> mesClassesExternes;
2/ Dans un manager de l'appli je tente loader les classes programmatiquement:
Je récupère mes classes, mais les manager dans les classes externes ne sont pas monté (@Autowired). ça se comprend vu que je ne les instancie pas avec Spring, mais là je ne vois pas comment faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @PostConstruct public void loadClasses() throws Exception { ClassLoader cl = new URLClassLoader(new URL [] {new URL("file://path/dossier/des/classes/")}, this.getClass().getClassLoader()); ClassPathScanningCandidateComponentProvider c = new ClassPathScanningCandidateComponentProvider(true); c.setResourceLoader(new DefaultResourceLoader(cl)); c.addIncludeFilter(new AssignableTypeFilter(IAlerteIRRule.class)); Set<BeanDefinition> set = c.findCandidateComponents("aa.bb.cc"); alerteIRRules = new HashSet<IAlerteIRRule>(); for (BeanDefinition b : set) { String className = b.getBeanClassName(); logger.debug("Classe loadee : " + className); Class<?> clazz = cl.loadClass(className); IClasseExterne r = (IClasseExterne) clazz.newInstance(); mesClassesExternes.add(r); } }
Merci d'avance pour votre aide![]()
Partager