跳到主要内容

集成东方通TongWeb(SpringBoot3)

Version: 3.7+ 版本(SpringBoot 3.x)

JDK版本:17

前后台项目均部署到TongWeb,前后台采用war包打包方案。

本文针对 SpringBoot 3 版本(jakarta.* 命名空间、JDK17)。TongWeb的Web容器必须支持Jakarta Servlet 5.0+,否则SpringBoot3的war无法部署,部署前请与运维确认。

TongWeb介绍

TongWeb(东方通应用服务器)是一款企业级Java应用服务器中间件,功能对标Apache Tomcat/WebLogic/WildFly,用于部署和运行Java Web应用。

TongWeb采用Java语言纯自研架构,全面支持Jakarta EE/Java EE规范,完成了大量国产环境(CPU、OS、数据库)的兼容适配性测试,对国产信创环境有很好的兼容性。

TongWeb支持WAR包和目录方式部署,提供Web管理控制台和命令行两种管理方式,支持虚拟主机、集群部署、负载均衡等企业级特性。

环境说明

项目要求
操作系统TencentOS Server 3.3 (TK4)
JDK17+
TongWeb版本8.0+(需支持Jakarta Servlet 5.0+)

一、TongWeb安装部署

1. 上传安装包和授权文件

TongWeb安装包和license授权文件上传至服务器:

TongWeb8.0.9.12.tar.gz
license.dat

2. 解压安装

# 解压TongWeb安装包
cd /opt
tar -zxvf TongWeb8.0.9.12.tar.gz

解压后目录结构:

/opt/TongWeb/
├── bin/ # 启动脚本
├── domains/ # 域配置
├── lib/ # 依赖库
└── version8.0.9.12.zip # 版本包

3. 配置license

将授权文件 license.dat 复制到 TongWeb 安装根目录${tongweb.home}):

# 将license.dat复制到TongWeb根目录(不是子目录)
cp license.dat /opt/TongWeb/

# 确认license文件已就位
ls -l /opt/TongWeb/license.dat

授权文件名必须为 license.dat,放在 TongWeb 安装根目录下(与 bin/domains/ 同级),不要放到子目录里。没有 license 文件 TongWeb 无法启动。

4. 设置信任 IP(远程访问必须)

TongWeb 默认只允许本机访问控制台,远程浏览器访问会提示「该操作仅限于在服务器本机或受信任的IP上执行」。必须在启动前设置信任 IP。

修改 ${tongweb.home}/domains/domain1/conf/console.xml,找到 trustedIP 配置,设为 *(信任所有 IP)或指定 IP:

vi /opt/TongWeb/domains/domain1/conf/console.xml

找到 trustedIP 属性,将值改为 *

<console sessionTimeout="15" trustedIP="*">

* 表示信任所有 IP(不建议生产环境使用),生产环境请填写具体 IP,多个 IP 用逗号分隔。必须在 TongWeb 停止状态下修改,运行期间修改不生效。

5. 切换 Jakarta 命名空间(部署 SpringBoot3 必须)

TongWeb 8.0 默认是 javax 命名空间(Servlet 4),而 Spring Boot 3 需要 jakarta 命名空间(Servlet 5.0+)。不切换会导致应用部署后 Spring Boot 无法启动(控制台显示部署成功但访问 404,日志无明显报错)。

通过 version.sh 确认当前命名空间:

/opt/TongWeb/bin/version.sh | grep Package
# 默认输出:Server Package: javax

打开 ${tongweb.base}/domains/domain1/conf/tongweb.xml,在根元素 <tongweb> 上添加 reversePkg="true" 属性:

<tongweb compatibleToVersion="8.0.9.12" reversePkg="true">

reversePkg="true" 表示启动时自动反转命名空间:当前是 javax 则切换为 jakarta。修改后重启 TongWeb 生效。

重启后再次确认:

/opt/TongWeb/bin/version.sh | grep Package
# 应输出:Server Package: jakarta

修改 tongweb.xml 必须在 TongWeb 停止状态下进行(主配置文件有防篡改限制)。

6. 启动TongWeb

cd /opt/TongWeb/bin

# 赋予执行权限
chmod +x *.sh

# 启动TongWeb
./startserver.sh

看到以下类似日志时,代表启动完成:

TongWeb Server start in xxx ms

确认端口监听正常:

# 管理控制台端口9060,应用HTTP端口8088
ss -tlnp | grep -E '9060|8088'

7. 访问管理控制台

浏览器访问:https://<服务器IP>:9060/console

默认账号:

项目
用户名thanos
密码thanos123.com

默认端口:管理控制台 9060(HTTPS),应用HTTP端口 8088。首次登录系统会强制要求修改初始密码。

二、JeecgBoot后台打war

所有改动集中在以下几个文件。

1. 修改jeecg-system-start/pom.xml打包格式

<!-- 由 jar 改为 war -->
<packaging>war</packaging>

2. 移除或注释spring-boot-maven-plugin

war部署到外部容器无需repackage成可执行jar:

<build>
<plugins>
<!-- 删除或注释以下插件 -->
<!--
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
-->
</plugins>
</build>

3. 内嵌Tomcat保留默认scope(重要)

不要将 spring-boot-starter-tomcat 设为 provided。JeecgBoot 中 TomcatFactoryConfig、积木报表 JimuReportConfiguration 等类直接引用 org.apache.catalina.connector.Connector,若 Tomcat 设为 provided,这些类在 TongWeb 环境中找不到 Connector 类,启动时报 NoClassDefFoundError: org/apache/catalina/connector/Connector

保留默认 scope(不写 <scope>),让 tomcat-embed-* 提供 org.apache.catalina.* 类。WAR 部署到外部容器时,内嵌 Tomcat 不会真正启动,仅提供类供引用:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 不要设为 provided -->
</dependency>

tomcat-embed-core 的类位于 org.apache.catalina.*org.apache.coyote.* 等包,与 TongWeb 的 com.tongweb.* 不冲突。WAR 部署模式下 Spring Boot 使用外部容器,内嵌 Tomcat 工厂 bean 不会被使用。

4. 自动生成部署描述符(关键)

部署到 TongWeb 外部容器时,Spring Boot 的 ServletContainerInitializer 需要 web.xml 触发初始化,否则应用虽然部署成功但 Spring 不会启动。同时需要 tongweb-web.xml 设置类加载器为 child-first。

jeecg-system-start/src/main/ 下创建 webconfig 目录,放入两个配置文件:

src/main/webconfig/web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="6.0">
<display-name>jeecg-boot</display-name>
</web-app>

src/main/webconfig/tongweb-web.xml

<tongweb-web-app>
<class-loader delegate="false"/>
</tongweb-web-app>

class-loader delegate="false" 表示应用类优先加载(child-first),避免 TongWeb 自带的 Jakarta EE API 与 WAR 中依赖冲突。

jeecg-system-start/pom.xml<build> 节点中配置 maven-war-plugin,打包时自动复制到 WEB-INF/

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>${project.basedir}/src/main/webconfig</directory>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>

5. 注释WebSocketConfig中的ServerEndpointExporter

外部容器自带WebSocket容器,框架内的ServerEndpointExporter会重复注册导致启动报错。打开jeecg-boot-base/jeecg-boot-base-core下的org.jeecg.config.WebSocketConfig,注释掉:

// @Bean
// public ServerEndpointExporter serverEndpointExporter() {
// return new ServerEndpointExporter();
// }

6. 解决 Hibernate/JPA 冲突(关键)

TongWeb 容器自带 Jakarta EE API(jakarta.persistence.*),部署 Spring Boot 3 war 时会自动触发 JPA 配置,与 WAR 中 Hibernate 5(javax.persistence.* 命名空间)冲突,报 IncompatibleClassChangeError

两处修改:

jeecg-boot-base-core/pom.xml — DmDialect 排除重复的 Hibernate 传递依赖:

<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmDialect-for-hibernate5.0</artifactId>
<version>${dm8.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</exclusion>
</exclusions>
</dependency>

达梦 JDBC 驱动 DmJdbcDriver18 不动,数据库连接不受影响。

JeecgSystemApplication.java — 禁用 JPA 自动配置,排除内嵌 Tomcat 工厂配置类:

import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;

@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
// 部署到外部容器(TongWeb/BES)时排除自定义内嵌 Tomcat 工厂(外部容器中无需,避免创建多余的内嵌容器工厂 bean)
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
org.jeecg.config.init.TomcatFactoryConfig.class
}))

7. 配置application-prod.yml

SpringBoot 3 的 Redis 配置位于 spring.data.redis.*(SpringBoot 2 为 spring.redis.*),从旧工程迁移时务必修改前缀。

spring:
profiles:
active: prod
datasource:
dynamic:
datasource:
master:
url: jdbc:mysql://<数据库IP>:3306/<库名>?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: <用户名>
password: <密码>
driver-class-name: com.mysql.cj.jdbc.Driver
data:
redis:
host: <redis主机>
port: 6379
password: <密码>

jeecg:
path:
upload: /home/jeecg/upload
webapp: /home/jeecg/webapp
uploadType: local

8. 执行打包

# maven勾选prod profile,在项目根目录执行
mvn clean install -Pprod -pl jeecg-module-system/jeecg-system-start -am -DskipTests

产物:jeecg-system-start/target/jeecg-system-start-{版本号}.war

三、前台项目打包

1. 修改接口地址.env.production

#后台接口父地址(必填)
VITE_GLOB_API_URL=/jeecg-boot

# 后台接口全路径地址(必填)
# HTTP方式
VITE_GLOB_DOMAIN_URL=http://服务器IP:8088/jeecg-boot

# 如果已配置HTTPS证书,使用HTTPS地址
# VITE_GLOB_DOMAIN_URL=https://域名/jeecg-boot

VITE_GLOB_API_URL(接口父地址)必须与后端部署的 应用前缀/上下文路径完全一致。后端前缀为 /jeecg-boot,前端这里也必须是 /jeecg-boot——写成 /jeecgboot(漏写横杠)会导致前端所有接口 404,表现为页面能打开但登录、验证码请求报「网络请求错误,未找到该资源」。

2. 执行打包

pnpm install
pnpm build

3. 添加WEB-INF/web.xml

dist目录下新增WEB-INF目录及web.xml文件:

mkdir -p dist/WEB-INF

dist/WEB-INF/web.xml内容如下:

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

没有WEB-INFweb.xmlTongWeb部署时将提示无法识别应用类型

4. 打war

cd dist
jar -cvf jeecg-vue.war ./*

将前端的war包与后端war包上传至服务器:

/data/deployFile/jeecg-boot.war
/data/deployFile/jeecg-vue.war

如果不想打war包,可以将前端打包好的目录手动上传到服务器中,部署时文件位置选择服务器即可

六、部署项目

控制台部署

部署后端

  • 1、打开应用管理页面,点击部署按钮。
  • 2、文件位置选择服务器,填写路径/data/deployFile/jeecg-boot.war
  • 3、点击添加

后端的应用前缀必须与前端项目打包时设置的接口地址中的路径一致!可在列表中看到

部署前端

  • 1、打开应用管理页面,点击部署按钮。
  • 2、文件位置选择服务器,填写路径/data/deployFile/jeecg-vue.war,修改应用前缀为/(根路径)。
  • 3、点击添加

七、访问测试

# HTTP访问测试
http://<服务器IP>:8088/

# 测试后端接口
http://<服务器IP>:8088/jeecg-boot/sys/getCheckCode
  • 1、通过http://<服务器IP>:8088/(或https://域名/)访问系统,进入登录页面。
  • 登录页面
  • 登录后首页

至此JeecgBoot(SpringBoot3)集成TongWeb完成。