ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Spring Boot应用从Tomcat迁移至东方通TongWeb的完整实践指南

2026/8/6 2:10:06 拓冰建站 浏览量
Spring Boot应用从Tomcat迁移至东方通TongWeb的完整实践指南 1. 项目背景与核心诉求为什么要在Spring Boot中替换Tomcat如果你是一个在“信创”或“国产化”项目里摸爬滚打过的Java开发者看到“Spring Boot 东方通TongWeb替换Tomcat”这个标题大概率会心一笑然后眉头一皱。这背后不是什么技术炫技而是一个非常具体且迫切的工程需求将原本运行在开源Tomcat上的Spring Boot应用平滑迁移到国产中间件东方通TongWeb上。这事的起因很简单但过程绝不简单。在很多涉及关键信息基础设施的领域技术栈的“自主可控”是硬性要求。Spring Boot作为事实上的Java微服务开发标准其默认内嵌的Web服务器是Tomcat。而TongWeb作为一款成熟的国产Java应用服务器需要能够承载这些Spring Boot应用。所以替换的核心不是“能不能”而是“怎么才能做得稳、不出错”。我经历过不止一次这样的迁移从最初的“照着文档硬上”到后来的“摸清门道”中间踩过的坑、熬过的夜都化成了这篇实操指南。这不是一篇简单的配置对照表我会带你深入Spring Boot的启动机制理解替换的本质并分享那些官方文档里不会写的、只有在真实生产环境压测和排查中才能获得的经验。2. 理解替换的本质Spring Boot的Web服务器抽象层在动手改配置之前我们必须先搞清楚Spring Boot是怎么管理Web服务器的。很多人以为替换就是改个依赖、换个配置但如果底层原理没吃透一个不起眼的配置项就可能导致应用启动失败或者运行时出现各种灵异问题。Spring Boot通过spring-boot-starter-web默认引入了Tomcat的starterspring-boot-starter-tomcat。它的精妙之处在于它提供了一套统一的Servlet Web服务器抽象接口主要是ServletWebServerFactory而Tomcat、Jetty、Undertow等具体实现都是这个接口的“插件”。我们要做的就是把Tomcat这个“插件”拔掉换上TongWeb这个“插件”。关键点在于TongWeb本身是一个完整、独立的应用服务器类似于WebLogic、WebSphere它并不是一个像spring-boot-starter-tomcat那样的、可以简单内嵌的轻量级组件。因此我们的“替换”通常有两种模式内嵌模式较少用将TongWeb的核心库以依赖形式引入让Spring Boot像启动内嵌Tomcat一样启动TongWeb容器。这需要TongWeb提供相应的支持库和Spring Boot集成包。外置模式主流推荐将Spring Boot应用打包成标准的WAR包然后部署到独立安装的TongWeb应用服务器中。这是企业级部署最常用、也最稳定的方式能充分利用TongWeb自身的管理、监控、集群等高阶特性。基于稳定性和生产环境最佳实践本篇将重点详解外置部署模式。这也是绝大多数国产化迁移项目的标准路径。3. 从Spring Boot可执行JAR到TongWeb可部署WAR关键改造步骤将一个默认生成可执行JAR的Spring Boot项目改造成能部署到TongWeb的WAR包需要以下几个核心步骤。我会详细说明每一步的意图和操作细节。3.1 修改打包方式与排除内嵌Tomcat首先打开你的pom.xml文件。修改打包类型将packaging从jar改为war。packagingwar/packaging这告诉Maven我们需要生成一个WAR归档文件而不是可执行的JAR。排除内嵌Tomcat依赖在spring-boot-starter-web依赖中排除掉Tomcat starter。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId !-- 排除内嵌的Tomcat -- exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency为什么必须排除如果不排除打出的WAR包内会包含Tomcat的库。当这个WAR包部署到TongWeb时两个容器包内的Tomcat和TongWeb可能会在类加载、端口监听、Servlet初始化等方面发生冲突导致部署失败或行为异常。这是第一个容易踩的坑。添加Servlet API依赖provided scopedependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version3.1.0/version !-- 版本需与TongWeb内置的Servlet规范版本匹配 -- scopeprovided/scope /dependency关键点解析scopeprovided/scope意味着该依赖在编译和测试时需要但在打包时不会包含进去。因为TongWeb作为应用服务器已经提供了Servlet API的实现。这样打包可以避免WAR包中库的重复和潜在冲突。务必确认版本TongWeb 7.0通常对应Servlet 3.1你可以查阅TongWeb的官方文档。3.2 改造Spring Boot启动类继承SpringBootServletInitializer这是让WAR包能在外部Servlet容器TongWeb中启动的关键。你需要修改你的主应用类通常是带有SpringBootApplication注解的类。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; SpringBootApplication public class YourApplication extends SpringBootServletInitializer { // 重点继承 Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // 重点重写configure方法指向应用主类 return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }原理剖析SpringBootServletInitializer是Spring Boot提供的、用于支持外部Servlet容器启动的基类。它实现了Servlet 3.0的ServletContainerInitializer接口。当TongWeb启动时会扫描WAR包中的这个类并调用其configure方法从而引导Spring Boot应用的初始化。如果没有这一步你的应用在TongWeb上只会被当作一个静态资源文件Spring上下文根本不会启动。3.3 处理静态资源与模板引擎的路径问题Spring Boot内嵌服务器时对静态资源/static,/public等和模板文件如Thymeleaf、FreeMarker的路径处理有一套默认规则。迁移到外置TongWeb后这些资源的寻址方式可能发生变化。常见问题页面访问404图片、CSS、JS加载失败或者模板引擎找不到模板文件。排查与解决确认打包后资源位置使用mvn clean package打包后用解压工具打开生成的WAR包检查你的静态资源和模板文件是否在WEB-INF/classes下的正确目录里例如/static/,/templates/。调整资源处理器配置在application.properties或application.yml中可以显式配置资源映射。但大多数情况下Spring Boot的自动配置在WAR包中依然有效。如果失效可以尝试# 例如强制指定静态资源路径谨慎使用通常不需要 # spring.web.resources.static-locationsclasspath:/static/关于JSP如果你的项目还在用JSP虽然Spring Boot不推荐需要额外注意。从热词“tongweb jsp is missing from the classpath”就能看出这是个高频坑。你需要确保有JSP相关的依赖如javax.servlet.jsp:jsp-api,org.apache.tomcat.embed:tomcat-embed-jasper但注意scope应为provided因为TongWeb自带JSP引擎。在application.properties中配置视图解析器spring.mvc.view.prefix/WEB-INF/jsp/ spring.mvc.view.suffix.jsp最关键的一点将你的JSP文件放在src/main/webapp/WEB-INF/jsp/目录下这是标准WAR结构而不是Spring Boot默认的src/main/resources下的某个目录。这是目录结构的硬性要求TongWeb会按照标准Servlet容器的规范去webapp目录下寻找JSP。3.4 配置文件的多环境适配内嵌Tomcat时服务器配置如端口、上下文路径、SSL通常在application.properties里用server.xxx来配置。但在外置TongWeb中这些配置的优先级发生了变化。端口与上下文路径现在由TongWeb服务器实例的配置决定。你需要在TongWeb的管理控制台或对应的配置文件server.xml、context.xml中设置应用的访问端口和上下文路径Context Path。WAR包中的应用自身server.port配置通常会被忽略。最佳实践建议在Spring Boot的配置文件中将server.port等配置移除或者仅作为开发环境内嵌Tomcat运行的配置。生产环境的配置完全交由TongWeb管理。可以使用Spring Profiles来区分# application-dev.properties (用于本地开发内嵌Tomcat) server.port8080 server.servlet.context-path/myapp # application-prod.properties (用于TongWeb部署) # 这里不配置server.port和context-path # 其他业务相关的配置如数据库连接池、Redis等在此处配置打包时通过-Dspring.profiles.activeprod激活生产环境配置。4. TongWeb侧部署配置详解与避坑指南WAR包准备好了接下来就是部署到TongWeb。这里面的门道比单纯的“点击部署”要多得多。4.1 TongWeb的安装与基础环境确认版本匹配这是所有稳定性的基石。务必确认你的JDK版本、Spring Boot版本与TongWeb官方认证的兼容性列表一致。例如TongWeb 7.0可能官方支持JDK 8/11Spring Boot 2.3.x ~ 2.7.x。使用不兼容的版本组合可能会遇到无法启动、类找不到NoClassDefFoundError、方法不存在NoSuchMethodError等诡异问题。内存调整TongWeb作为一个企业级应用服务器默认内存配置可能针对大型应用。对于你的Spring Boot应用需要根据实际情况调整JVM堆内存-Xms,-Xmx、元空间-XX:MaxMetaspaceSize等参数。配置位置通常在TongWeb安装目录下的bin/startserver.shLinux或bin/startserver.batWindows脚本中。经验之谈曾经遇到一个应用在Tomcat上跑得好好的部署到TongWeb后频繁Full GC。最后发现是TongWeb默认的GC策略和堆内存比例与Tomcat不同。通过调整-XX:UseG1GC和新生代/老年代比例参数后稳定。建议部署前用jmap、jstat工具观察一下内存使用情况。4.2 应用部署与管理控制台操作部署WAR包通常有两种方式控制台部署登录TongWeb管理控制台默认端口9060或9050找到应用部署模块上传WAR包或指定WAR包路径进行部署。这是最直观的方式。热部署目录将WAR包直接复制到TongWeb的autodeploy目录下具体路径请参考TongWeb文档服务器会自动检测并部署。适合CI/CD流水线自动化。配置上下文路径Context Root在部署时或部署后务必设置正确的上下文路径。这决定了你的应用通过什么URL访问如http://host:port/yourContextPath。如果这里没设或设错会导致404。数据源等资源绑定如果你的应用使用JNDI查找数据源这是企业级应用的推荐做法需要在TongWeb控制台中预先配置好对应的JDBC连接池Connection Pool并绑定一个JNDI名称如jdbc/MyDataSource。然后在Spring Boot的配置文件中通过spring.datasource.jndi-name属性来引用它。# application-prod.properties spring.datasource.jndi-namejdbc/MyDataSource4.3 高频问题排查与解决实录结合热词和实际经验这里有几个你极有可能遇到的坑问题一应用启动报错“java.lang.NoClassDefFoundError”或“java.lang.ClassNotFoundException”排查思路检查依赖冲突这是最常见的原因。使用mvn dependency:tree -DincludesgroupId:artifactId命令检查WAR包中WEB-INF/lib是否存在同一个库的多个版本。重点排查spring-core,spring-web,spring-webmvc,jackson,log4j/logback等核心库。检查TongWeb自带库TongWeb的lib目录下自带了很多Java EE API和常用库如Servlet API, JSP API, JSTL, Jackson等。如果你的WAR包里包含了相同库的不同版本可能会因类加载器优先级问题导致冲突。解决方案将WAR包中那些与服务器提供库重复的依赖scope设为provided。这需要你仔细比对TongWeb的文档了解其内置的库列表。检查本地Maven仓库有时本地仓库的jar包损坏也会导致此问题。尝试mvn clean install -U强制更新依赖。问题二日志乱码热词“java log乱码 东方通”原因分析乱码问题通常出在字符集Charset不一致上。可能涉及TongWeb服务器控制台输出的字符编码。Spring Boot应用日志框架Logback/Log4j2配置的编码。应用代码中处理请求/响应时未明确指定编码如UTF-8。解决方案统一为UTF-8这是黄金准则。确保你的源代码文件、配置文件、数据库连接、前端页面全部使用UTF-8编码。配置TongWeb JVM参数在TongWeb的启动脚本如startserver.sh中添加-Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8。配置Logback在logback-spring.xml中显式指定控制台和文件输出的编码。appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder charsetUTF-8/charset pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender检查应用代码在Filter或Interceptor中确保对HttpServletRequest和HttpServletResponse设置了正确的字符编码。问题三静态资源或接口访问404但应用日志显示启动成功排查思路检查上下文路径确认在浏览器中访问的URL是否包含了TongWeb中为应用配置的上下文路径。检查Spring MVC的DispatcherServlet映射默认是/会处理所有请求。但如果你的web.xml如果有或者TongWeb的配置中修改了它的映射就会导致请求无法到达Spring。对于纯Spring Boot应用无web.xml通常不需要担心。检查TongWeb的默认应用TongWeb可能有一个根上下文/的应用。如果你的应用上下文路径也是/可能会冲突。建议为你的应用设置一个明确的非根路径。启用Spring Boot的Actuator端点在application.properties中启用management.endpoints.web.exposure.include*然后访问/actuator/health等端点。如果Actuator端点能访问说明Spring MVC框架是工作的问题可能出在你的具体Controller映射或静态资源路径上。问题四Session相关问题如热词中提到的分布式Session问题场景当你在TongWeb集群中部署多个相同应用实例时需要解决Session共享问题避免用户登录一个节点后请求到另一个节点Session失效。解决方案Spring Boot提供了成熟的解决方案。使用Spring Session引入spring-session-data-redis等starter将Session存储到Redis、数据库等外部存储中。这是最推荐的方式。dependency groupIdorg.springframework.session/groupId artifactIdspring-session-data-redis/artifactId /dependency在配置文件中配置Redis连接信息即可。这样所有TongWeb节点都从同一个Redis读写Session实现了共享。配置TongWeb的Session复制部分应用服务器支持集群内的Session复制功能。这需要查阅TongWeb集群配置文档进行设置但通常比基于外部存储的方案配置更复杂且对网络要求高。5. 进阶考量性能调优与监控对接应用跑起来只是第一步要稳定高效地运行还需要一些进阶操作。5.1 连接池与线程池调优TongWeb自带连接池如DBCP、HikariCP可选。如果你在Spring Boot中使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa它默认会配置一个HikariCP连接池。这里存在一个潜在冲突你可能会配置两个连接池。推荐做法二选一并统一配置。方案A推荐使用TongWeb的JNDI数据源。如上文所述在TongWeb控制台配置连接池然后在Spring Boot中通过JNDI引用。这样连接池的生命周期由应用服务器管理便于全局监控和调整。方案B禁用TongWeb数据源使用Spring Boot内置池。确保Spring Boot的配置生效并关闭TongWeb对数据源的任何默认管理。这需要对TongWeb配置更熟悉。线程池调优Spring Boot的Web应用特别是使用Async或ThreadPoolTaskExecutor会用到线程池。这些线程池的配置核心线程数、最大线程数、队列容量需要根据实际业务压力和服务器资源进行调整避免队列积压或线程耗尽。5.2 与TongWeb管理监控的集成TongWeb提供了丰富的管理控制台和监控指标。为了让运维更顺畅可以考虑暴露Spring Boot Actuator端点Spring Boot Actuator提供了应用健康、指标、日志级别管理等丰富的端点。你可以通过配置将这些端点安全地暴露出来方便集成到TongWeb的监控体系或独立的监控平台如PrometheusGrafana中。management.endpoints.web.exposure.includehealth,info,metrics,prometheus management.endpoint.health.show-detailsalways # 注意安全最好配合spring-security进行端点保护日志统一收集配置Logback或Log4j2将应用日志输出到指定文件并确保其路径和滚动策略符合运维规范便于TongWeb的日志管理功能进行收集和查看。5.3 持续集成/持续部署CI/CD适配在国产化环境中自动化部署同样重要。你需要调整你的Jenkins、GitLab CI等流水线脚本。构建阶段使用Maven Profile来区分构建产物的类型。例如定义一个prod-tongwebprofile在其中设置packagingwar/packaging并排除Tomcat依赖。profile idprod-tongweb/id properties packaging.typewar/packaging.type /properties dependencies !-- 可能在此profile中额外引入或调整一些依赖 -- /dependencies /profile构建命令mvn clean package -Pprod-tongweb部署阶段将生成的WAR包通过SCP、FTP等方式传输到TongWeb服务器的autodeploy目录或者调用TongWeb提供的管理API如果支持进行部署。注意直接复制到autodeploy目录通常是热部署可能会导致应用重启在生产环境需规划好发布窗口。6. 总结与个人心得走完这一整套流程你会发现“替换Tomcat”远不止改个依赖那么简单。它涉及打包方式、启动机制、配置体系、依赖管理、部署运维等多个层面的调整。其本质是将一个“自成一体”的Spring Boot可执行JAR改造为一个符合Java EE/WAR标准、能够受控于外部应用服务器的企业级应用模块。我个人的体会是这类迁移项目前期充分的兼容性测试和性能基准测试至关重要。不要等到上线前夕才做整体切换。应该在开发中期就搭建好TongWeb测试环境将CI/CD流水线指向它进行持续的集成测试。重点测试功能一致性所有API、页面、业务流程在TongWeb上是否与Tomcat环境完全一致。性能表现在相同压力下响应时间、吞吐量、资源CPU、内存、线程使用率是否有差异。稳定性进行长时间的压力测试观察内存泄漏、连接池耗尽、线程阻塞等情况。最后保持耐心细致地阅读官方文档善用日志进行排查。每一次成功的国产化迁移不仅是完成一个技术任务更是对应用架构和团队工程能力的一次深度锤炼。当你看到应用在TongWeb上平稳运行的那一刻你会觉得这些折腾都是值得的。