Spring Boot 项目迁移到 TongWeb 7.0.4.2 详细指南

Spring Boot 项目迁移到 TongWeb 7.0.4.2 详细指南(基于 Spring Boot 2.1.3 + 达梦 V8)

本文档详细描述了如何将一个基于 Spring Boot 2.1.3 的 Web 应用迁移部署到 TongWeb 7.0.4.2 服务器,并对接达梦 V8 数据库的完整流程,包括项目改造、依赖冲突解决、多应用部署问题、达梦数据库配置踩坑、前端路由 404 处理以及带前缀访问问题等常见问题的解决方案。


一、Spring Boot 项目改造:从内嵌 Tomcat 迁移到 TongWeb(打包为 WAR)

TongWeb 是一款 Java EE 应用服务器(类似 WebLogic、WebSphere),不支持直接运行 Spring Boot 内嵌的 Tomcat,因此需要将 Spring Boot 项目改造成 ​WAR 包部署模式

✅ 步骤 1:排除 Spring Boot 内嵌 Tomcat

pom.xml 中,排除默认的 spring-boot-starter-tomcat,避免与 TongWeb 的 Servlet 容器冲突:

<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>

✅ 不需要引入额外的 spring-boot-starter-tomcatjavax.servlet-api,TongWeb 会提供完整的 Servlet 容器支持。


✅ 步骤 2:修改打包方式为 WAR

pom.xml<packaging> 标签中,将默认的 jar 改为 war

<packaging>war</packaging>

✅ 步骤 3:修改 Spring Boot 启动类,继承 SpringBootServletInitializer

为了让 Spring Boot 应用能够在传统 Servlet 容器(如 TongWeb)中启动,需要让主类继承 SpringBootServletInitializer 并重写 configure 方法:

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • 该方式同时支持:
    • 直接运行 main 方法(内嵌容器,如测试环境)​
    • 打成 WAR 包后部署到 TongWeb(生产/预发布)​

二、TongWeb 7.0.4.2 部署常见问题与解决方案

❗ 问题 1:java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getValueExtractors()Ljava/util/Set;

报错原因:​
TongWeb 7 自带了 javax.validation(Bean Validation API)相关 jar 包,但是 ​版本与 Spring Boot 2.1.3 默认依赖的 validation-api 版本不一致​(Spring Boot 2.1.3 默认使用 validation-api 2.0.1.Final,而 TongWeb 可能自带较低或冲突版本)。

典型错误信息:​

Caused by: java.lang.ClassNotFoundException: javax.validation.ParameterNameProvider

解决方案:​

📌 ​推荐方案:用你项目中引入的 validation-api(通常是 2.0.1.Final)替换 TongWeb lib 目录下的旧版本 validation-api.jar

操作步骤:

  1. 找到你项目依赖的 validation-api-2.0.1.Final.jar(一般在 Maven 本地仓库或项目的 WEB-INF/lib 下)
  2. 进入 TongWeb 安装目录,找到 lib/ 目录
  3. 删除原有的 validation-api.jar(或类似名称的旧版 JAR)​
  4. 将你项目使用的 validation-api-2.0.1.Final.jar 复制到 TongWeb 的 lib/ 目录下

✅ 这样可以保证 TongWeb 使用与 Spring Boot 兼容的 Bean Validation API 版本,避免 NoSuchMethodError 或 ClassNotFoundException。


❗ 问题 2:多应用部署时出现 JMX MBean 冲突

报错信息:​

Unable to register MBean [...] nested exception is javax.management.InstanceAlreadyExistsException: ...

原因:​
Spring Boot 默认开启 JMX(spring.jmx.enabled=true),当多个应用部署在同一个 TongWeb 容器中时,如果它们的 MBean Domain 相同(默认是应用类名或 Spring 上下文默认值),就会导致 MBean 注册冲突。

解决方案(任选其一):​

✅ 办法一:全局关闭 JMX(推荐简单场景)

application.ymlapplication.properties 中添加:

spring:
  jmx:
    enabled: false

⚠️ 如果你的项目没有使用 JMX 监控、Spring Cloud 等依赖,可以直接关闭,避免冲突。

✅ 办法二:为每个应用设置不同的 JMX Domain(推荐多应用部署)

在每个应用的 application.yml 中设置唯一的 domain 名称,例如:

spring:
  jmx:
    default-domain: project1  # 项目1使用 project1

另一个应用则配置为:

spring:
  jmx:
    default-domain: project2  # 项目2使用 project2

✅ 这样每个应用的 MBean 会注册到不同的 JMX Domain 下,避免冲突。


三、达梦数据库(DM V8)配置踩坑指南

❗ 问题 1:TongWeb 不支持 log4jdbc

错误尝试写法:​

datasource:
  url: jdbc:log4jdbc:dm://127.0.0.1:5236/SYSDBA?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
  username: SYSDBA
  password: SYSDBA
  driver-class-name: net.sf.log4jdbc.DriverSpy

问题:​
TongWeb 环境下,使用 log4jdbc 的 JDBC URL 前缀 (jdbc:log4jdbc:...) 会导致连接失败,且 TongWeb 官方未提供相关兼容性支持,​目前无已知解决方案,不建议在 TongWeb 中使用 log4jdbc。​


❗ 问题 2:将达梦驱动包直接放在项目 lib 目录并 pom 引入,却报 ClassNotFoundException

错误做法:​

  • DmJdbcDriver18.jar 放到项目的 /lib 文件夹
  • 并在 pom.xml 中引入依赖,但运行时仍报错:
    ClassNotFoundException: dm.jdbc.driver.DmDriver

原因:​
TongWeb 对于非标准 Maven 仓库的 jar 包管理机制严格,​仅靠 pom 引入但未正确安装到本地/私服 Maven 仓库时,TongWeb 可能无法正确加载驱动类。​


✅ 正确做法:将达梦 JDBC 驱动安装到本地 Maven 仓库,并正确引入依赖

步骤 1:使用 Maven 命令将达梦驱动安装到本地仓库

mvn install:install-file \
  -Dfile=/path/to/your/DmJdbcDriver18.jar \
  -DgroupId=com.dm \
  -DartifactId=DmJdbcDriver18 \
  -Dversion=1.8 \
  -Dpackaging=jar

📌 请将 /path/to/your/DmJdbcDriver18.jar 替换为你本地的达梦 JDBC 驱动实际路径

步骤 2:在 pom.xml 中引入依赖

<dependency>
  <groupId>com.dm</groupId>
  <artifactId>DmJdbcDriver18</artifactId>
  <version>1.8</version>
</dependency>

步骤 3:配置数据源(使用标准 JDBC URL)

datasource:
  driver-class-name: dm.jdbc.driver.DmDriver
  url: jdbc:dm://127.0.0.1:5236/SYSDBA?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
  username: SYSDBA
  password: SYSDBA

✅ 使用 jdbc:dm:// 前缀,而不是 log4jdbc 的前缀,确保 TongWeb 能正确加载原生达梦驱动。


四、前端部署相关问题(配合 WAR 包部署)

❗ 问题 1:前端页面刷新出现 404

原因:​
前端使用 React/Vue 等 SPA 框架,通过路由跳转时由前端 JS 控制,刷新页面时请求的是 ​后台真实路由,但 TongWeb(或后端服务)没有对应的 Servlet 或 Controller 处理该路径,导致 404。

解决方案:​

修改 TongWeb 的默认错误页面配置,将 404 错误重定向到前端入口文件 index.html,让前端路由再次接管:

🔧 修改 TongWeb 安装目录下的配置文件:

TongWeb安装目录/conf/default-web.xml

添加如下配置:

<error-page>
    <error-code>404</error-code>
    <location>/index.html</location>
</error-page>

✅ 这样当访问一个未映射的后端路由时,TongWeb 会返回前端 index.html,然后由前端框架处理路由。


❗ 问题 2:前端部署带前缀(如 /app)导致资源/路由 404

原因:​
如果前端项目打包时未正确设置 base 路径(比如部署在 TongWeb 的 /app 路径下),那么前端静态资源路径和路由跳转都会出错,导致 JS/CSS 加载失败或路由刷新 404。

解决方案:​

请联系前端同学,在打包时指定正确的前缀(base path),例如:

  • 如果部署路径是 http://xxx:port/app/,则前端打包时需要设置:
    • Vue: publicPath: '/app/'
    • React: 设置 homepage: '/app' 或使用 basename 配置路由

并且确保:

  • 打包后的文件是直接打成 zip 后改名为 war,​不是将外层文件夹再打成 zip
  • 前端资源路径与 TongWeb 部署的 context path 保持一致

五、总结 Checklist ✅

步骤/问题解决方案
Spring Boot 改造为 WAR 部署 排除 tomcat、修改 packaging、启动类继承 SpringBootServletInitializer
TongWeb 与 validation-api 冲突 替换 TongWeb lib 下的 validation-api.jar 为项目使用的版本(如 2.0.1.Final)
TongWeb 多应用部署 JMX 冲突 关闭 jmx(spring.jmx.enabled=false) 或 设置不同的 spring.jmx.default-domain
达梦数据库驱动问题 不要使用 log4jdbc;不要直接放 jar 包到项目;推荐用 mvn install 安装到达梦驱动到本地仓库,pom 正确引入,url 使用 jdbc:dm://
前端刷新 404 修改 TongWeb 的 default-web.xml,添加 404 路由指向 /index.html
前端带前缀部署 404 前端打包时设置正确的 base path / homepage,并确保 war 包结构正确

 

posted @ 2021-02-19 15:31  不要学我说话  阅读(10387)  评论(0)    收藏  举报