新项目直接采用SpringBoot提供的插件可以很方便的构建现代的可执行的“uber jar”。历史项目很多是采用外置tomcat容器进行部署的,在用SpringBoot框架重构项目后,需要在不更改部署方式的情况,要求SpringBoot要能支持传统的部署形式,本文基于SpringBoot官方文档,调试了SpringBoot支持的传统war部署方式。

由于Spring WebFlux并不严格依赖于servlet API,并且应用程序默认部署在嵌入式Reactor Netty服务器上,因此WebFlux应用程序不支持War部署。

本文所有关于SpringBoot的源码示例,均是基于SpringBoot-2.7.6版本来的,参照调试时要注意不同版本间的代码差异。

1.WAR包构建

创建maven工程调试本文所描述的内容,完整的POM依赖如下:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.7.6

com.example.war

war-demo

0.0.1-SNAPSHOT

war-demo

Demo project for Spring Boot

war

1.8

UTF-8

UTF-8

2.7.6

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-tomcat

provided

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

1.1.SpringBootServletInitializer

生成可部署的war文件的第一步是提供SpringBootServletInitializer子类并覆盖其configure方法。这样做可以利用Spring Framework的servlet 3.0支持,并允许您在servlet容器启动应用程序时对其进行配置。通常,您应该更新应用程序的主类以扩展SpringBootServletInitializer,如以下示例所示:

package com.example.war;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.builder.SpringApplicationBuilder;

import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**

* @Description

* @Author misterbig

* @Date 2024/2/22

*/

@SpringBootApplication

public class MyWarApplication extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(MyWarApplication.class);

}

public static void main(String[] args) {

SpringApplication.run(MyWarApplication.class, args);

}

}

1.2.更新构建配置

更新您的构建配置,以便您的项目生成一个war文件而不是jar文件。如果您使用Maven和spring-boot-starter-parent(为您配置Maven的war插件),您所需要做的就是修改pom.xml以将打包更改为war,如下所示:

war

1.3.运行时排除内嵌的Servlet容器

确保嵌入的servlet容器不会干扰war文件部署到的servlet容器。为此,您需要将嵌入式servlet容器依赖项标记为已提供。

如果使用Maven,下面的示例将servlet容器(在本例中为Tomcat)标记为已提供:

org.springframework.boot

spring-boot-starter-tomcat

provided

如果使用Spring Boot构建工具,则将嵌入的servlet容器依赖项标记为所提供的将生成一个可执行的war文件,其中所提供的依赖项打包在lib提供的目录中。这意味着,除了可以部署到servlet容器之外,还可以通过在命令行上使用java-jar来运行应用程序。

2.Tomcat部署

2.1.手动部署

可以将构建好的war包直接传到“CATALINA_HOME”的“webapps”目录下,tomcat容器会自动解包,启动tomcat容器(批处理脚本:D:\apache-tomcat-9.0.86\bin\startup.bat)后就能自动访问服务内容了。如下图:

关于上图中tomcat控制台输出的日志乱码问题,主要是控制台日志输出编码格式导致的,可以通过修改tomcat日志配置文件得以解决。以本示例中使用的tomcat应用为例,需要修改的配置文件完整路径为“‪D:\apache-tomcat-9.0.86\conf\logging.properties”,需要修改的配置项为“java.util.logging.ConsoleHandler.encoding”,如下图:

2.2.使用IDEA(本地调试推荐)

添加一个新的本地tomcat组件,作为一个启动候选文件,部署war包内容并应用。IDEA选择该启动候选配置文件,直接启动tomcat服务即可,如下图:

文章来源

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。