2010-03-24 6 views
0

J'ai un service Web basé sur le printemps. Je veux maintenant construire une sorte de plugin pour l'étendre avec des haricots. Ce que j'ai maintenant dans web.xml est:Extension de l'application basée sur le printemps

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/*-configuration.xml</param-value> 
</context-param> 

Mon application de base a main-configuration.xml qui déclare ses haricots. Mon application de plugin a plugin-configuration.xml qui déclare des beans supplémentaires. Maintenant, quand je déploie, ma construction déploie plugin.jar en /WEB-INF/lib/ et copie plugin-configuration.xml en /WEB-INF/classes/ tous sous main.war.

Tout va bien (bien que je pense qu'il pourrait y avoir une meilleure solution), mais quand je développe le plugin, je ne veux pas avoir deux projets dans Eclipse avec des dépendances. Je souhaite avoir main.jar que j'inclue comme bibliothèque. Cependant, web.xml de main.jar n'est pas détecté automatiquement. Comment puis-je faire ceci? Injection de haricot? Bean découverte de quelque sorte? Autre chose?

Note: Je vous attendre à avoir plusieurs plugins différents dans la production, mais le développement de chacun d'eux sera contre main.jar pur

Merci.

Répondre

1

Je pense qu'il ya une approche plus simple:

Dans votre application hôte (la webapp) définir quelque chose comme le paramètre contextConfigLocation suivant:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:/META-INF/foo/*-configuration.xml</param-value> 
</context-param> 

Les éléments essentiels sont classpath*: comme il en résulte le balayage de la classpath entier pour les fichiers de configuration correspondant au modèle suivant. Si vous utilisez uniquement classpath:, la recherche s'arrêtera au premier fichier trouvé. Il ne traversera pas non plus les fichiers JAR s'il n'est pas correctement enregistré.

La deuxième partie cruciale consiste à avoir au moins un chemin de base non générique pour que la recherche fonctionne. Cela est dû à Classloader traits qui retourne uniquement de manière fiable toutes les ressources si elles contiennent un chemin de base (voir le Javadoc sur PathMatchingResourcePatternResolver pour plus de détails).

Qu'est-ce que vous avez maintenant à voir avec vos projets de plug-in est de placer votre plugin-configuration.xml dans /META-INF/foo/, package que JAR et placez-le dans votre classpath (au cas où vous construisez avec Maven simplement ajouter la dépendance). Au démarrage de l'application, Spring récupère également tous les fichiers de configuration de vos plugins et construit le fichier ÀpplicationContext` à partir de em.

Vous voudrez peut-être aussi vérifier un autre poste que j'ai fait sur la modularité de l'application avec Spring: How do you make a multi-module spring configuration?

1

Au lieu de /WEB-INF/classes/*-configuration.xml, essayez classpath:*-configuration.xml Vous pouvez également lister les fichiers de configuration, chacun sur une nouvelle ligne.

Vous devrez vous assurer que main.jar se termine dans WEB-INF/lib, si vous n'utilisez pas maven, vous pouvez le faire dans eclipse en marquant votre webapp en fonction du projet qui crée le main. jar, via les propriétés du projet.

Questions connexes