如何更改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