如何更改JAR Spring Boot应用程序以打包和部署为WAR?

WAR与JAR

默认情况下,Spring Boot应用程序打包为带有嵌入式Tomcat的可执行JAR文件。可以通过java -jar命令直接运行它们。传统的Java Web应用程序需要运行servlet容器(应用程序服务器)。需要安装,配置此类服务器,然后将应用程序部署到该服务器。而且需要为每个环境准备好这样的服务器。使用Spring Boot时,这种方法会被反转,因为app服务器直接位于JAR中。这样有许多优点,但有时可能需要将Spring Boot应用程序作为传统WAR。例如,如果受公司策略约束,需要部署到提供的应用服务器。

现在将研究如何将Spring Boot应用程序打包为WAR,而不会牺牲直接可执行性。

新的应用程序

在创建新应用程序时,非常简单。可以使用所有必需的设置和依赖项生成应用程序,而不是自己创建应用程序。有一个名为Spring Initializr的官方工具。

默认情况下,隐藏所有高级选项。可以只设置Spring版本,语言或构建工具等基础知识。当然还有所有的依赖关系。



在高级选项部分中,有选择。默认情况下,有Jar。能够直接运行JAR,因为它包含嵌入式Tomcat应用程序服务器。

IDEA集成

使用Spring Initializr生成应用程序比手动创建应用程序更方便,不容易出错。由于需要访问外部网页,下载zip文件并将其解压缩,存在一些不便之处。

可以直接从IDE使用Spring Initializr。在IntelliJ IDEA中:

File → New Project → Spring Initializr

在这里,可以指定Web版本中的所有选项,但麻烦较少。



Maven

只需更新pom.xml文件中的包装部分即可

jar

到WAR包装

war

要确保嵌入式Tomcat依赖项与目标Tomcat上已存在的内容不相冲突,需要将它们标记为已提供。

Maven的

使用Maven,只需将此依赖项添加到pom.xml文件中即可dependencies。

并指定依赖范围为provided,这样tomcat 相关的jar就不会打包到war 里了

org.springframework.boot spring-boot-starter-tomcat provided

SpringBootServletInitializer

现在需要确保应用程序正确运行为WAR

import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(BootWarApplication.class); }}

运行WAR

这种方法的优点在于仍然可以将WAR作为带有嵌入式Tomcat的可执行文件运行。这样,可以在不牺牲直接可执行性的情况下进行WAR部署。

只需像往常一样运行命令。

java -jar demo-1.0.0-SNAPSHOT.war