在信创国产化改造项目中,越来越多的政企客户环境用东方通TongWeb替换了Tomcat或WebLogic。TongWeb作为国产应用中间件,通常要求应用以war包的形式部署到外置容器中,由中间件统一管理生命周期、端口和连接池。而SpringBoot项目默认打成内嵌Tomcat的可执行jar包,直接运行虽然方便,却无法被TongWeb当作标准Web应用识别和托管。因此,把SpringBoot项目从jar包改造成war包并部署到TongWeb外置容器,是信创适配中非常典型的一道工序。本文从改造步骤、部署操作、特点优势与适用场景三个层面详细展开。

一、SpringBoot项目从jar包改造为war包的完整步骤
改造的核心思路是:去掉内嵌容器对war部署的干扰,让生成的war包符合Servlet规范,可以被任意标准容器加载。整个改造只涉及pom.xml和启动类两处改动,代价非常小。
第一步是修改打包方式。在pom.xml中把<packaging>jar</packaging>改为war,如果没有显式声明packaging,默认值是jar,需要显式加上war声明:
<groupId>com.example</groupId> <artifactId>demo-web</artifactId> <version>1.0.0</version> <!-- 打包方式改为war --> <packaging>war</packaging>
第二步是处理内嵌Tomcat依赖。war包部署到外置容器时,内嵌的Tomcat不仅多余,还可能和TongWeb自带的Servlet实现产生类冲突,导致启动报错。标准做法是把spring-boot-starter-tomcat的scope改为provided:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除内嵌Tomcat,避免与外置容器冲突 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- provided表示编译期可用,打包时不带入war -->
<scope>provided</scope>
</dependency>
</dependencies>
第三步是改造启动类。SpringBoot的main方法启动方式在外置容器中不会被执行,容器加载war包时走的是Servlet 3.0+的SPI机制,需要启动类继承SpringBootServletInitializer并重写configure方法:
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
// 外置容器入口:容器启动时通过Servlet 3.0 SPI回调此方法
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
// 保留main方法,本地开发时仍可java -jar或IDE直接启动
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
改完之后执行mvn clean package,target目录下会生成war包。这里有两个容易踩的坑需要注意:一是JDK版本要与TongWeb兼容,TongWeb 7一般支持JDK 8到17,具体看版本说明;二是如果项目里用了JSP,必须保证JSP文件位于src/main/webapp目录下,且打包插件不要遗漏web资源。另外,finalName建议设置成简短的应用名,因为TongWeb默认以war包名作为访问上下文路径:
<build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
二、部署到TongWeb外置容器的具体操作
拿到war包后,登录TongWeb管理控制台。TongWeb 7默认控制台地址是http://127.0.0.1:9060/console,安装时如果修改过端口则以实际配置为准。进入左侧导航的应用管理页面,点击部署应用,选择上传war包或指定服务器上的文件路径,点击下一步后TongWeb会自动解析war结构并识别出SpringBoot应用。
部署向导中需要关注两个配置项:一是上下文根(Context Root),默认取war包名,比如demo.war对应/demo,也可以改成/作为根应用;二是虚拟主机或服务绑定,单机部署直接默认即可,集群场景需要勾选对应的服务实例。确认后点击完成,应用状态变为运行中即部署成功,此时通过http://主机:9060/demo可以访问接口。
如果不想用控制台,也可以走命令行方式。TongWeb兼容大部分Tomcat目录约定,将war包直接放到domains目录下对应实例的autodeploy文件夹中,容器启动时会自动解压部署。这种方式适合脚本化交付和CI/CD流水线对接。
部署过程中常见的报错有几类。第一类是ClassNotFoundException,指向spring内嵌tomcat相关类,多半是scope没改成provided导致类冲突;第二类是启动成功但访问404,通常是上下文根没配置对,或者SpringBoot的server.servlet.context-path配置与TongWeb的上下文根冲突,外置部署时建议删掉应用内的context-path配置,交给容器管理;第三类是EL表达式或JSP解析报错,多因TongWeb内置的JSP引擎版本与依赖的el-api版本不一致,把相关依赖同样设为provided即可。
三、外置容器部署的特点、优势与适用场景
先说特点。外置容器部署意味着应用的运行环境由中间件提供,端口、线程池、HTTP连接器、会话管理等基础设施全部收归TongWeb统一配置,应用本身只关注业务逻辑。这与jar包自包含、自带运行时的理念正好相反,两种模式没有绝对优劣,而是面向不同的管理诉求。
外置部署的优势主要体现在三个方面。首先是统一管控:运维人员可以在TongWeb控制台集中管理多个应用的生命周期,查看线程池、JVM、连接池监控数据,做灰度启停,不需要逐台服务器执行kill命令。其次是安全合规:国产中间件通过了等保和安全测评,政企客户在信创验收时要求应用跑在指定中间件上,war包部署是硬性要求。最后是资源复用与故障隔离:多个war应用共享同一个容器的线程池和连接池资源,由容器层面做隔离和限流,比每个应用独占一个JVM进程更节省内存。
适用场景可以这样判断:当项目面向党政、金融、军工等信创领域,客户指定东方通TongWeb作为中间件时,必须采用war包外置部署;当企业内部有成熟的中间件运维体系,需要统一端口规划、统一监控告警时,外置部署更合适;当应用规模小、追求快速迭代和容器化微服务部署时,jar包加Docker的方式反而更轻便。简单说,重管控、强合规选war包外置,重敏捷、云原生选jar包内嵌,理解了这个取舍逻辑,遇到国产化适配需求就能从容应对了。
TongWebSpringBootwar包部署修改时间:2026-09-13 13:20:51