如何將War文件部署到Spring Boot嵌入式的Tomcat中 - Vojtech Ruzicka

19-10-12 banq
              

默認情況下,Spring Boot在嵌入式Tomcat中以jar形式運行(盡管您可以將其部署為常規WAR)。與嵌入式應用程序服務器一起運行非常好,但是有時您可能需要將另一場戰爭與嵌入式應用程序捆綁在一起。也許您有一個舊版應用程序需要包括在內,但不想為此設置常規的Tomcat。

幸運的是,使用Spring Boot,這很容易。具體實現方式取決于您的Spring Boot版本。

Spring Boot 2.x

您需要做的就是在您的一個@Configurationtype類中聲明一個bean?TomcatServletWebServerFactory。然后,您需要重寫getTomcatWebServer()方法。這樣增加war如同運行tomcat.addWebApp()一樣簡單。

請注意,在下面的示例中,webapps由于默認情況下該目錄不存在,因此需要創建該目錄。它是通常將war部署到Tomcat的目錄。

@Bean
public TomcatServletWebServerFactory servletContainerFactory() {
? ? return new TomcatServletWebServerFactory() {
? ??
? ? ? @Override
? ? ? protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
? ? ? ? ? // webapps directory does not exist by default, needs to be created
? ? ? ? ? new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs();
? ??
? ? ? ? ? // Add a war with given context path
? ? ? ? ? // Can add multiple wars this way with different context paths
? ? ? ? ? tomcat.addWebapp("context-path", "path-to-your-war.war");
? ??
? ? ? ? ? return super.getTomcatWebServer(tomcat);
? ? ? }
? ??
? ? };
}

您可以將它們外部化為屬性,而不必硬編碼WAR的路徑及其上下文路徑,并且僅在存在這些屬性時使用加載WAR(使用@ConditionalOnProperty)。

您可以將它們放入您application.properties的應用程序中,也可以在運行應用程序時將它們作為命令行參數傳遞。這樣,您可以例如在進行本地開發時跳過加載您的WAR,或者在不同的環境中提供不同的工件。

@Bean
@ConditionalOnProperty(name = "external.war.file")
public TomcatServletWebServerFactory servletContainerFactory(@Value("${external.war.file}") String path,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@Value("${external.war.context}") String contextPath) {
? ? return new TomcatServletWebServerFactory() {

? ? ? ? @Override
? ? ? ? protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
? ? ? ? ? ? new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs();

? ? ? ? ? ? tomcat.addWebapp(contextPath, path);

? ? ? ? ? ? return super.getTomcatWebServer(tomcat);
? ? ? ? }

? ? };
}

如果要將WAR部署到/,則需要使用一個空字符串作為上下文根。為了避免與Spring Boot應用程序發生沖突,可以application.properties通過設置來更改其上下文根server.servlet.context-path。

使用胖JAR中的依賴項

如果要避免兩個工件都使用重復的依賴關系,則可以指定外部WAR應使用胖JAR的類加載器。

Context context = tomcat.addWebapp("context-path", "path-to-your-war.war");
context.setParentClassLoader(getClass().getClassLoader());

Spring Boot 1.x

Spring Boot 2.x進行了大量的重構,在運行Spring Boot 1.x時,您需要使用其他類來部署WAR。還請注意該try-catch塊,這對于捕獲方法拋出的已檢查異常是必需的。

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

? ? ? ? @Override
? ? ? ? protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
? ? ? ? ? ? ? ? Tomcat tomcat) {

? ? ? ? ? ? new File(tomcat.getServer().getCatalinaBase(), "webapps").mkdirs();
? ? ? ? ? ??
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? tomcat.addWebapp("context-path", "path-to-your-war.war");
? ? ? ? ? ? } catch (ServletException e) {
? ? ? ? ? ? ? ? log.error("Unable to deploy war to embedded Tomcat");
? ? ? ? ? ? }

? ? ? ? ? ? return super.getTomcatEmbeddedServletContainer(tomcat);
? ? ? ? }

? ? };
}

如果您想更改Spring Boot應用程序的上下文路徑,則該過程與2.x相同,除了其中的屬性名稱application.properties不同,這也適用于1.x版本server.context-path。

添加對JSP的支持

如果您的外部非Spring Boot WAR包含JSP,則需要確保為其提供適當的依賴項,因為嵌入式Tomcat默認情況下不包含它們。對于Maven,您可以使用:

<dependency>
? ? <groupId>org.apache.tomcat.embed</groupId>
? ? <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
? ? <groupId>javax.servlet</groupId>
? ? <artifactId>jstl</artifactId>
</dependency>

對于Gradle,請改用以下代碼:

compile "org.apache.tomcat.embed:tomcat-embed-jasper"
compile "javax.servlet:jstl"

?

              

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片