2015-07-13 10 views
23

Wbudowany tomcat Spring Boot jest bardzo przydatny zarówno do programowania, jak i wdrażania.Spring Boot: Jak dodać kolejne pliki WAR do osadzonego tomcat?

Ale co, jeśli należy dodać inny plik WAR (na przykład GeoServer)?

Może dodaje się zwykłą procedurę:

  1. Instalacja normalny serwer Tomcat.
  2. Utwórz aplikację Spring Boot jako plik WAR i dodaj ją do folderu webapps serwera Tomcat.
  3. Dodaj również inny plik WAR (3rd-party) do folderu webapps.

Ale byłoby miło, gdyby następująca konfiguracja była możliwa.

  1. Zbuduj aplikację rozruchową Spring jako samodzielny Jar, który zawiera osadzony Tomcat.
  2. Wdróż jar Jar aplikacji.
  3. Dodaj kolejny plik WAR (firmy zewnętrznej) do folderu, który rozpoznaje osadzony Tomcat.
  4. Służy do udostępniania zawartości aplikacji Spring boot i innej zawartości WAR za pomocą wbudowanego Tomcat.

Jak można to zrobić?

UPDATE

Gdy aplikacja bagażnika sprężyna jest wykonana z tłuszczu słoik (= wykonywalny JAR), kod odpowiedź nie wystarcza. Zmieniona jeden jest następujący:

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

    }; 
} 

Ponieważ pliki jar w słoiku tłuszczu nie mogą być ładowane przez classloader systemu, wyraźne rodzic classloader musi być określona. W przeciwnym razie dodatkowa WAR nie może załadować słoików z biblioteki do słoja z aplikacją wiosennego rozruchu, która dodała WAR.

+0

Przeczytaj opisy znaczników. "Wbudowany" nie jest "osadzaniem"! – Olaf

+0

Obecnie próbuję zrobić to samo ([patrz tutaj] (http://stackoverflow.com/questions/42191815/cannot-add-web-application-to-built-in-tomcat)), ale dostaję tony wyjątków z powodu braku zależności plików. Masz pomysł, czego tu brakuje? – displayname

Odpowiedz

19

Możesz dodać plik wojenny do osadzonego Tomcat za pomocą Tomcat.addWebapp. Jak mówi javadoc, jest to "odpowiednik dodawania aplikacji internetowej do katalogu aplikacji Tomcat". Aby użyć tego interfejsu API w Spring Boot, musisz użyć niestandardowej podklasy TomcatEmbeddedServletContainerFactory:

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

    }; 
} 
+0

Dzięki! Udało mi się zintegrować WAR z Twoim kodem. (Pojawia się kilka ostrzeżeń, ale jest to specyficzne dla WAR, które dodałem i myślę, że można to rozwiązać). – zeodtr

+6

Drobny problem: Gdy plik server.tomcat.basedir nie został określony w pliku application.properties, rozszerzenie WAR nie powiedzie się. Powód jest następujący: Jeśli ta zmienna nie jest określona, ​​Spring tworzy katalog tymczasowy i przypisuje go jako baseDir. Ale ten katalog nie ma podkatalogu "wepapps", w którym wbudowany tomcat próbuje użyć podkatalogu mkdir() dla rozszerzonych plików WAR. – zeodtr

+0

Gdy aplikacja do rozruchu sprężynowego jest wykonana z słoika z tłuszczem, powyższy kod jest niewystarczający. Zobacz moją AKTUALIZACJĘ. – zeodtr