2015-07-13 7 views
23

Der eingebettete Tomcat von Spring Boot ist sowohl für die Entwicklung als auch für die Bereitstellung sehr praktisch.Spring Boot: Wie fügt man dem eingebetteten Tomcat weitere WAR-Dateien hinzu?

Aber was ist, wenn eine andere (3rd-Party) WAR-Datei (zum Beispiel GeoServer) hinzugefügt werden sollte?

Vielleicht ist das folgende das normale Verfahren:

  1. einen normalen Tomcat-Server installieren.
  2. Erstellen Sie die Spring Boot-Anwendung als WAR-Datei und fügen Sie sie dem Ordner webapps des Tomcat hinzu.
  3. Fügen Sie auch eine andere (3rd-party) WAR-Datei zum Ordner webapps hinzu.

Aber es wäre nett, wenn die folgende Konfiguration möglich wäre.

  1. Erstellen Sie die Spring Boot-Anwendung als eigenständige Jar, die den integrierten Tomcat enthält.
  2. Stellen Sie die Spring-Startanwendung Jar bereit.
  3. Fügen Sie eine weitere (3rd-party) WAR-Datei zu einem Ordner hinzu, den der eingebettete Tomcat erkennt.
  4. Den Inhalt der Spring-Boot-Anwendung und den Inhalt des anderen WAR mithilfe des eingebetteten Tomcat bereitstellen.

Wie kann es gemacht werden?

UPDATE

Wenn die Feder Boot-Anwendung von Fett jar (= ausführbare jar) gemacht wird, ist der Code in der Antwort nicht genug. Der überarbeitete ist wie folgt:

@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); 
     } 

    }; 
} 

Da die JAR-Dateien in einem Fett Glas können nicht durch das System Classloader, ein expliziter Mutterclassloader angegeben werden muss geladen werden. Andernfalls kann der zusätzliche WAR die Bibliotheks-Jars nicht in den Fat-Jar der Spring-Boot-Anwendung laden, die den WAR hinzugefügt hat.

+0

Lesen Sie die Tag-Beschreibungen. "Embedded" ist nicht "Einbetten"! – Olaf

+0

Ich versuche derzeit, das gleiche zu tun ([siehe hier] (http://stackoverflow.com/questions/42191815/cannot-add-web-application-to-built-in-tomcat)), aber ich bekomme Tonnen von Ausnahmen wegen fehlender Dateiabhängigkeiten. Irgendeine Idee, was ich hier verpasse? – displayname

Antwort

19

Sie können dem eingebetteten Tomcat eine WAR-Datei hinzufügen, indem Sie Tomcat.addWebapp verwenden. Wie sein Javadoc sagt, ist es "das Äquivalent zum Hinzufügen einer Webanwendung zu Tomcat's Web Apps Verzeichnis". Um diese API im Spring Boot zu verwenden, müssen Sie eine benutzerdefinierte TomcatEmbeddedServletContainerFactory Unterklasse verwenden:

+0

Danke! Es ist mir gelungen, einen WAR mit deinem Code zu integrieren. (Ein paar Warnungen erscheinen, aber es ist spezifisch für den Krieg, den ich hinzugefügt habe und ich denke, dass es gelöst werden kann). – zeodtr

+6

Ein kleines Problem: Wenn server.tomcat.basedir nicht in application.properties angegeben ist, schlägt die WAR-Erweiterung fehl. Der Grund ist wie folgt: Wenn diese Variable nicht angegeben ist, erstellt Spring ein temporäres Verzeichnis und weist es als baseDir zu. Aber dieses Verzeichnis hat kein 'wepapps' -Unterverzeichnis, in dem der eingebettete tomcat versucht, ein Unterverzeichnis für die expandierten WAR-Dateien zu mkdir() zu erstellen. – zeodtr

+0

Wenn die Spring-Boot-Anwendung aus Fettglas gemacht wird, reicht der obige Code nicht aus. Bitte sehen Sie meine UPDATE. – zeodtr

Verwandte Themen