2009-01-23 11 views
3

J'ai un fichier foo.war provenant d'un fournisseur tiers. J'ai défini un contexte dans ma configuration Tomcat en créant conf/Catalina/localhost/foo.xml qui contient:Chargement d'un contexte/servlet au démarrage dans Tomcat * WITHOUT * changement de descripteur de déploiement (web.xml)

<Context docBase="/path/to/foo.war" ...> ... </Context> 

Je veux Tomcat charger le contexte foo au démarrage. Mais le WEB-INF/web.xml (descripteur de déploiement) dans le fichier foo.war n'inclut pas de <load-on-startup>, donc Tomcat attend jusqu'à la première requête. Je préfère vraiment ne pas déballer le tiers foo.war pour modifier leur web.xml. De plus, je devrais le faire chaque fois que le fournisseur publie une nouvelle version de leur .war.

Existe-t-il un moyen, dans la configuration de Tomcat, de dire à Tomcat de charger le contexte foo au démarrage? Je sais que dans l'élément <Context> vous pouvez définir des paramètres, env vars, etc. sans modifier le fichier web.xml. Mais je ne trouve rien dans les documents Tomcat sur le chargement au démarrage.

Répondre

3

C'est difficile. Vous êtes limité par les conventions de Tomcat et d'autres conteneurs, il n'y a donc pas de solution simple.

Vous pouvez utiliser le fichier web.xml global pour initialiser des servlets et/ou des JSP spécifiques à partir du fichier .war à l'aide de l'élément <load-on-startup>. C'est la seule façon que je connaisse de forcer le chargement au démarrage sans modifier le fichier .war ou le fichier WEB-INF/web.xml à l'intérieur. Notez que vous devrez peut-être initialiser les servlets et JSP en utilisant différents noms/chemins pour éviter les conflits. Bien sûr, faire cela signifie que vous devez en savoir assez sur le .war pour initialiser l'application, ce qui pourrait signifier regarder son web.xml pour déterminer ce qu'il faut charger. Cela pourrait aller à l'encontre du but, car ce n'est pas vraiment une approche non-manuelle pour charger n'importe quel .war au démarrage. Mais avec un peu de travail supplémentaire, vous pouvez écrire un script qui extrait les informations nécessaires du fichier web.xml du fichier .war et l'ajoute automatiquement à votre fichier web.xml global. Maintenant, si vous êtes prêt à envisager l'écriture de script pour modifier le fichier .war, vous pouvez écrire un script qui extrait WEB-INF/web.xml du fichier .war, ajoute <load-on-startup> éléments enfants à tous les fichiers .war <servlet> éléments et met à jour le fichier .war avec la nouvelle copie. Je ne suis pas sûr de ce que l'environnement que vous utilisez pour exécuter Tomcat, mais voici un exemple de script bash qui ferait le travail:

#!/bin/sh 

TEMPDIR=/tmp/temp$$ 
WARFILE=/path-to-tomcat/webapps/foo.war 

mkdir -p $TEMPDIR/WEB-INF 
pushd $TEMPDIR 
unzip -qq -c $WARFILE WEB-INF/web.xml \ 
    | sed 's#</servlet>.*#<load-on-startup>99</load-on-startup></servlet>#' \ 
    > WEB-INF/web.xml 
zip -f $WARFILE WEB-INF/web.xml 
popd 
rm -rf $TEMPDIR 

Vous pouvez exécuter ce script ou quelque chose de similaire dans le cadre de votre démarrage Tomcat. J'espère que cela t'aides.

+0

David a donné une bonne solution de contournement, et j'accepterais cette réponse, mais j'espère qu'il y a une façon native de Tomcat. Je laisse donc cette question sans réponse pour le moment. – netjeff

Questions connexes