跳到主要内容

集成东方通 TongWeb

SpringBoot版本:4.x

JDK版本:17

本文为认证测试专用新文档,实际安装介质为 D:\东方通\信创国产化适配软件\TongWeb8.0.9.13.zip。TongWeb 授权文件名为 license.dat,必须确认授权所属产品后再使用。

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

本文针对 SpringBoot 4 版本(jakarta.* 命名空间、JDK17+)。部署前必须确认当前 TongWeb 8.0.9.13 补丁级别支持 SpringBoot4 应用所需的 Jakarta Servlet 规范;规范版本不兼容时,WAR 无法正常启动。

TongWeb介绍

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

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

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

环境说明

项目要求
操作系统Octop on TencentOS Server 4
JDK17+
TongWeb版本8.0.9.13(需确认支持SpringBoot4所需的Jakarta Servlet规范)

一、TongWeb安装部署

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

本次提供的外层压缩包中还包含一层同名 ZIP。先在本地连续解压两层,取得以下服务器安装包:

TongWeb8.0.9.13.tar.gz

将该 tar.gz 和东方通提供的 TongWeb 专用 license.dat 上传至服务器。

2. 解压安装

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

解压后目录结构:

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

3. 配置license

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

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

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

4. 管理控制台访问方式

TongWeb管理控制台保持默认的本机访问限制。启动后先在服务器本机验证控制台:

curl -vk https://127.0.0.1:9060/console/

返回控制台登录页HTML,说明管理控制台已正常启动。远程管理时使用SSH端口转发访问本机控制台,具体命令见下文“访问管理控制台”。

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

TongWeb 8.0 默认可能运行在 javax 命名空间,而 Spring Boot 4 使用 jakarta 命名空间。不切换或 Servlet 规范版本不兼容,都会导致应用部署后无法启动;切换后仍须通过版本信息和实际部署日志确认兼容性。

通过 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.13" reversePkg="true">

实际配置中的 compatibleToVersion 应以安装后原文件中的值为准,只增加 reversePkg="true",不要改动其他属性。

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

重启后再次确认:

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

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

#永久开放9096/tcp端口
firewall-cmd --permanent --zone=public --add-port=9096/tcp

6. 启动TongWeb

cd /opt/TongWeb/bin

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

# 启动TongWeb
./startserver.sh

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

Server startup in xx seconds

确认端口监听正常:

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

7. 访问管理控制台

TongWeb管理控制台仅允许本机访问。远程电脑使用SSH端口转发,将本机9060端口映射到服务器的127.0.0.1:9060

在Windows PowerShell或终端执行:

ssh -L 9060:127.0.0.1:9060 root@<服务器公网IP>

保持SSH窗口处于连接状态,然后在本机浏览器访问:

https://127.0.0.1:9060/console/

首次访问时浏览器可能提示自签名证书风险,确认服务器地址无误后继续访问即可。该方式无需将管理控制台直接开放到公网。

默认账号:

项目
用户名thanos
密码thanos123.com

测试报告截图 4: 截取 TongWeb 控制台登录成功后的首页,密码和敏感服务器信息需要打码。

默认端口:管理控制台 9060(HTTPS),应用HTTP端口 8088。首次登录系统会强制要求修改初始密码。浏览器中的127.0.0.1:9060由SSH隧道转发到TongWeb服务器本机。

二、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>
<configuration>
<mainClass>org.jeecg.JeecgSystemApplication</mainClass>
</configuration>
</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 4 WAR 时需要重点检查容器 API 与应用内 ORM/JPA 依赖是否冲突;如出现 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 4 的 Redis 配置位于 spring.data.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集成TongWeb完成。