SpringBoot应用程序转换成WAR文件详解
allway2 人气:0如何在不牺牲嵌入式应用服务器的直接执行能力的情况下,将 JAR Spring 启动应用更改为打包和部署为 WAR。
WAR与JAR
默认情况下,Spring Boot 应用程序打包为带有嵌入式 Tomcat 的可执行 JAR 文件。您可以直接通过命令运行它们。传统的Java Web应用程序需要一个servlet容器(应用程序服务器)来运行。您需要安装、配置此类服务器,然后将应用程序部署到其中。而且您需要为每个环境准备这样的服务器。使用 Spring Boot,这种方法是相反的,因为应用程序服务器直接位于您的 JAR 中。这有很多优点,但有时您可能需要将 Spring Boot 应用程序作为传统的 WAR 来代替。例如,如果你受公司策略的约束,需要部署到提供的应用服务器。java -jar
在这篇文章中,我们将研究如何在不牺牲直接可执行性的情况下将 Spring Boot 应用程序打包为 WAR。
新应用
幸运的是,当您创建新应用程序时,该过程非常简单。您可以使用所有必需的设置和依赖项生成应用程序,而不是自己创建应用程序。有一个名为Spring Initializr的官方工具。
默认情况下,所有高级选项都是隐藏的。您可以只设置基本内容,例如 Spring 版本、语言或构建工具。当然还有所有的依赖关系。
您需要打开“选项”部分以指定打包。
在高级选项部分中,有“打包”选择。默认情况下,有Jar。这意味着您将能够直接运行 JAR,因为它包含一个嵌入式 Tomcat 应用程序服务器。
您不能将 JAR 部署到其他应用程序服务器(Tomcat、Jetty、JBoss 等)以在那里运行它们。他们只适用于战争。为了能够将应用部署到这些应用,需要将打包更改为WAR。
很棒的是,这样的 WAR 仍然可以自行执行,这很有用。例如,它非常适合本地开发,即使您在生产中使用常规应用服务器也是如此。
完成设置后,您可以单击生成项目,系统将下载包含应用的 zip 文件。
创意整合
使用 Spring Initializr 生成应用程序比手动创建应用程序更方便、更不容易出错。仍然有一些不便,因为您需要转到外部网页,下载zip文件并将其解压缩。
幸运的是,您可以直接从 IDE 使用 Spring Initializr。在IntelliJ IDEA中,您可以访问:
File → New Project → Spring Initializr
在这里,您可以像在网络版本中一样指定所有选项,但麻烦更少。
现有应用程序
当您已经将现有的 Spring 引导应用程序打包为 JAR 时,该过程稍微复杂一些,但仍然很简单。您需要手动进行一些更改。
让我们将应用程序转换为 WAR,将哪个 van 部署到应用程序服务器(如 Tomcat),同时仍保持其可执行性。
嵌入式雄猫依赖
为了确保嵌入式 Tomcat 依赖项不会与目标 Tomcat 上已有的内容冲突,您需要将它们标记为提供。
马文
使用 Maven,只需将此依赖项添加到您的文件中即可。pom.xml
dependencies
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
格拉德尔
使用 Gradle,过程类似,只需将依赖项添加到具有提供范围的部分即可。dependencies
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
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); } }
BootWarApplication.class
是应用中批注的类。@SpringBootApplication
如果你愿意,而不是一个单独的类,你可以让你的类扩展类并包含与上面相同的方法。@SpringBootApplication
SpringBootServletInitializer
configure
更改包装
现在,最后一步是确保您的应用正确打包为 WAR 而不是 JAR。
马文
只需从以下位置更新文件中的打包部分pom.xml
<packaging>jar</packaging>
到WAR包装
<packaging>war</packaging>
格拉德尔
在 Gradle 中,将插件添加到您的插件部分。war
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
id 'war'
}
建立WAR
构建过程保持不变,这里没有变化,只需运行,它将生成您的 WAR。mvn package
gradle build
现在,您可以部署到您选择的应用程序服务器。
运行WAR
这种方法很酷的地方在于,您仍然可以将 WAR 作为带有嵌入式 Tomcat 的可执行文件运行。这样,您可以在不牺牲直接可执行性的情况下进行 WAR 部署。
只需像往常一样运行存档即可。将最后一个参数替换为 WAR 的真实名称。
java -jar demo-1.0.0-SNAPSHOT.war
加载全部内容