Spring Boot: comment ajouter d'autres fichiers de guerre au tomcat intégré?

tomcat intégré à la botte de printemps est très pratique, tant pour le développement que pour le déploiement.

mais que se passe-t-il si un autre fichier de guerre (tiers) (par exemple, GeoServer) doit être ajouté?

peut-être que la procédure normale est la suivante:

  1. installer un serveur Tomcat normal.
  2. construisez L'application de démarrage de printemps comme un fichier WAR, et ajoutez-le au dossier webapps du Tomcat.
  3. ajouter aussi un autre fichier de guerre (tierce partie) aux webapps dossier.

Mais ce serait bien si la configuration suivantes sont possibles.

  1. construisez L'application de botte de printemps comme un bocal autonome, qui inclut le Tomcat intégré.
  2. déployer le pot D'application de la botte de printemps.
  3. Ajouter un autre fichier de guerre (de tierce partie) à un dossier que le Tomcat intégré reconnaît.
  4. servir à la fois le contenu de l'application de la botte de printemps et le contenu de l'autre guerre en utilisant le Tomcat.

Comment peut-il être fait?

UPDATE

lorsque l'application de démarrage à ressort est faite de fat jar (=exécutable jar), le code dans la réponse n'est pas suffisant. Le plan révisé est comme suit:

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            try {
                Context context = tomcat.addWebapp("/foo", "/path/to/foo.war");
                WebappLoader loader =
                    new WebappLoader(Thread.currentThread().getContextClassLoader());
                context.setLoader(loader);
            } catch (ServletException ex) {
                throw new IllegalStateException("Failed to add webapp", ex);
            }
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }

    };
}

étant donné que les fichiers jar d'un fat jar ne peuvent pas être chargés par le classloader système, un classloader parent explicite doit être spécifié. Sinon, la guerre supplémentaire ne peut pas charger les pots de bibliothèque dans le pot de graisse de la botte de printemps application qui a ajouté la guerre.

25
demandé sur zeodtr 2015-07-13 05:40:52
la source

1 ответов

vous pouvez ajouter un fichier war à Tomcat intégré en utilisant Tomcat.addWebapp. Comme le dit son javadoc, c'est"l'équivalent d'ajouter une application web au répertoire d'applications Web de Tomcat". Pour utiliser cette API dans la botte de printemps, vous devez utiliser un < personnalisé!--2--> sous-classe de:

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            // Ensure that the webapps directory exists
            new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs();

            try {
                Context context = tomcat.addWebapp("/foo", "/path/to/foo.war");
                // Allow the webapp to load classes from your fat jar
                context.setParentClassLoader(getClass().getClassLoader());
            } catch (ServletException ex) {
                throw new IllegalStateException("Failed to add webapp", ex);
            }
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }

    };
}
21
répondu Andy Wilkinson 2017-02-13 18:36:43
la source

Autres questions sur