JeecgBoot低代码平台在东方通TongWeb应用服务器的企业级部署实战

📅 2026/8/6 13:04:09
JeecgBoot低代码平台在东方通TongWeb应用服务器的企业级部署实战
1. 项目概述当低代码平台遇见国产中间件最近在帮一个客户做项目迁移从原来的开源Tomcat环境整体切换到国产的东方通TongWeb应用服务器上。项目本身是基于JeecgBoot这个国内非常流行的低代码开发平台构建的。整个过程下来感触颇深尤其是JeecgBoot这种前后端分离架构后端Spring Boot前端Vue3在TongWeb这类企业级中间件上的部署和传统的单体应用打包部署思路有不少差异。网上关于Spring Boot打WAR包部署的资料很多但结合JeecgBoot的特性和TongWeb的优化配置能讲清楚实操细节的并不多。今天我就把这次从环境准备、打包优化、部署配置到问题排查的全过程梳理一遍希望能给面临类似国产化迁移或企业级部署需求的同行们一个清晰的参考。简单来说这个方案的核心目标就两个一是稳确保JeecgBoot应用在TongWeb上稳定、高效地运行二是顺让从开发、构建到部署的整个流程顺畅易于维护和迭代。无论是为了满足信创要求还是追求更高的企业级性能与可靠性这套组合都值得深入研究。2. 整体部署架构与思路拆解2.1 为什么选择JeecgBoot TongWeb的组合在开始动手之前我们得先理解为什么这个组合有它的价值。JeecgBoot本质上是一个基于Spring Boot的快速开发平台它提供了大量的代码生成器和通用模块能极大提升后台管理系统的开发效率。它的前端默认采用Vue3通过分离部署前后端可以独立开发、独立发布。而东方通TongWeb是一款主流的国产Java EE应用服务器对标WebLogic、WebSphere。在企业级环境中它提供了Tomcat所不具备或较弱的高级特性比如更精细的内存管理、集群会话复制、更强大的管理控制台、与企业级监控系统的集成能力以及对国产芯片、操作系统的深度适配。将JeecgBoot部署到TongWeb上并不是简单地把一个Spring Boot应用扔进去。我们需要考虑的是如何让这个为“嵌入式Servlet容器”如内嵌Tomcat设计的应用更好地利用“外部Servlet容器”TongWeb的资源和管理能力同时保持JeecgBoot自身的特性如多数据源、权限框架、在线开发等不受影响。2.2 核心部署模式WAR包部署的必然性Spring Boot应用部署到外部容器标准做法就是打包成WAR。这和我们平时直接用java -jar运行可执行JAR包有本质区别。打WAR包意味着容器接管TongWeb将负责Servlet容器的生命周期、线程池、连接器等。依赖外置应用依赖的JAR包可以部分或全部由TongWeb的共享库提供减少WAR包体积。配置外置应用的配置文件如application.yml可以放在TongWeb指定的外部目录实现应用与配置分离便于不同环境开发、测试、生产的部署。对于JeecgBoot我们需要修改pom.xml将打包方式从jar改为war并排除内嵌的Tomcat依赖。这是第一步也是基础。2.3 前端Vue3项目的独立部署考量JeecgBoot的前后端是完全分离的。在开发环境我们通过Vue CLI的代理来解决跨域。但在生产环境通常有两种部署方式前后端分离部署Vue3项目打包成静态资源HTML、JS、CSS部署到Nginx等Web服务器上。后端WAR包部署在TongWeb。两者通过域名或路径区分。这种方式解耦彻底利于独立伸缩。前后端合并部署将Vue3打包后的静态资源直接拷贝到JeecgBoot后端项目的src/main/webapp或src/main/resources/static目录下然后一起打成一个WAR包。这样前端资源就由TongWeb一并服务。选择哪种方式取决于项目规模和运维习惯。对于中小型项目或希望简化部署流程的情况合并部署更简单。对于大型项目或需要前端独立快速迭代的分离部署更合适。本文会重点讲解后端WAR包在TongWeb的部署并对两种前端部署方式都给出指引。3. 环境准备与项目改造3.1 TongWeb应用服务器安装与基础配置首先你得有一套TongWeb。从东方通官网获取安装包后安装过程比较常规。这里强调几个关键点安装路径建议路径不要有中文和空格例如/opt/tongweb。JDK版本确认JeecgBoot项目所需的JDK版本通常是JDK 8或11并确保TongWeb使用的JDK版本与之兼容。可以在TongWeb的启动脚本如startserver.sh中检查JAVA_HOME设置。启动与访问安装完成后启动TongWeb通过http://服务器IP:9060访问管理控制台。默认端口9060是管理端口应用访问端口通常是8080可在安装时或管理台中修改。创建域和服务器对于生产环境建议在控制台中创建一个独立的“域”和“服务器”而不是使用默认的“base_domain”。这样可以实现环境隔离配置管理也更清晰。注意首次登录控制台后强烈建议修改默认的admin用户密码。同时熟悉一下控制台的主要功能区域应用部署、数据源配置、服务器配置、日志查看等。3.2 JeecgBoot后端项目改造为WAR包这是将Spring Boot应用适配外部容器的标准步骤。以JeecgBoot 3.x版本为例修改pom.xml文件!-- 1. 修改打包方式为 war -- packagingwar/packaging dependencies !-- 2. 移除或排除内嵌的Tomcat -- 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 !-- 3. 添加 provided 范围的 servlet-api 依赖 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId scopeprovided/scope /dependency /dependencies build finalName你的应用名/finalName !-- 定义生成的WAR包名称 -- plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build关键点在于provided范围的servlet-api这表示该依赖在打包时会被引入但在运行时由TongWeb这类容器提供避免冲突。修改启动类继承SpringBootServletInitializer并重写configure方法。import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class JeecgSystemApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(JeecgSystemApplication.class); } // 原有的main方法保留仍可用于jar包启动测试 public static void main(String[] args) { SpringApplication.run(JeecgSystemApplication.class, args); } }这个类的作用是让Spring Boot应用在外部Servlet容器启动时能够正确初始化。配置文件外置准备为了便于运维生产环境的配置application-prod.yml不应该打包在WAR内。我们计划将其放在TongWeb服务器外部。需要在项目中预留从外部读取配置的逻辑或者使用Spring Boot的spring.config.additional-location参数。更常见的做法是在TongWeb的启动脚本中通过JAVA_OPTS环境变量指定配置文件路径。3.3 Vue3前端项目生产环境构建进入你的Vue3项目目录通常是jeecg-boot/ant-design-vue-jeecg。环境变量配置在项目根目录创建或修改.env.production文件设置生产环境API地址。VITE_API_URL /jeecg-boot # 假设后端应用上下文路径是 /jeecg-boot # 或者使用完整地址VITE_API_URL http://your-backend-domain:port/jeecg-boot这里VITE_API_URL是Vite构建工具的环境变量在你的请求封装代码中会用到它作为基础URL。修改请求基地址在封装axios的代码文件中通常是src/utils/request.ts确保它使用了环境变量。const service axios.create({ baseURL: import.meta.env.VITE_API_URL, // 使用环境变量 timeout: 30000, });执行构建npm run build:prod # 或 yarn build:prod构建成功后会在项目根目录生成dist文件夹里面就是静态资源文件。接下来面临选择分离部署将dist文件夹下的所有文件上传到Nginx服务器的某个目录如/usr/share/nginx/html并配置Nginx将/jeecg-boot路径的API请求代理到后端的TongWeb服务器地址如http://localhost:8080/jeecg-boot。合并部署将dist文件夹下的所有文件全部复制到JeecgBoot后端项目的src/main/resources/static目录下。然后进行后端打包。这样访问http://tongweb:8080/jeecg-boot/时TongWeb会直接服务这些静态文件。实操心得我推荐在项目初期或中小型项目中使用合并部署因为部署包只有一个管理起来方便。但在访问量较大或前端需要频繁独立更新的场景分离部署是更优解可以利用Nginx的高效静态文件处理能力和负载均衡特性。4. 核心部署步骤与TongWeb配置详解4.1 WAR包生成与验证在JeecgBoot后端项目根目录下执行Maven打包命令mvn clean package -DskipTests -P prod-P prod指定使用prod环境配置文件如果你在pom.xml中定义了prodprofile。-DskipTests跳过测试加快打包速度。打包成功后在target目录下会生成你的应用名.war文件。你可以先用解压软件打开这个WAR包检查一下结构WEB-INF/classes/下应该有编译后的class文件和非静态的配置文件如application.yml但生产配置建议外置。WEB-INF/lib/下是所有项目依赖的JAR包。如果选择了合并部署根目录下应该有index.html以及assets等静态资源文件夹。4.2 TongWeb控制台部署应用登录TongWeb管理控制台(http://your-server:9060)。上传WAR包在控制台找到“应用管理”或“部署”模块选择“安装”或“部署应用”。通常有两种方式上传文件直接将本地的WAR包上传。指定路径如果WAR包已经上传到服务器某个路径如/opt/app/jeecg-app.war则选择“指定路径”方式。配置应用上下文路径在部署过程中会要求你指定“上下文根”。这就是你的应用访问路径。例如设置为/jeecg-boot那么应用完整的访问URL就是http://服务器IP:8080/jeecg-boot。这里需要和前端Vue项目中配置的VITE_API_URL基地址保持一致。部署设置部署顺序可以设置一个数字决定应用启动顺序。启动超时时间对于Spring Boot应用初始化可能较慢建议适当调大如300秒。类加载器通常使用默认的“父项优先”即可。如果遇到类冲突可以考虑“应用优先”。保存并启动完成配置后保存并启动应用。在控制台的“应用”列表里可以看到应用状态变为“活动”。4.3 关键配置优化数据源、JVM与日志仅仅部署成功还不够要稳定高效必须调整几个关键配置。1. 数据源配置强烈推荐在TongWeb中配置JNDI数据源为什么不用JeecgBoot配置文件里的数据源因为TongWeb管理的数据源具备连接池监控、分布式事务集成等能力更适合生产环境。在TongWeb控制台找到“资源”-“JDBC”-“数据源”。创建一个新的数据源填写JDBC驱动类名、URL、用户名、密码。关键参数初始连接数、最大连接数、最小连接数、连接超时时间。这些值需要根据你的数据库性能和业务压力来调整。一个初始参考初始5最大50超时30秒。创建完成后记下它的JNDI名称例如jdbc/jeecgDS。修改JeecgBoot配置在你的application.yml或外置配置文件中将原来的spring.datasource.dynamic配置注释或删除替换为spring: datasource: dynamic: primary: master datasource: master: jndi-name: java:comp/env/jdbc/jeecgDS这样应用就会从TongWeb的JNDI数据源获取连接。2. JVM参数调优TongWeb的JVM参数在其启动脚本中配置如startserver.sh或setenv.sh。找到JAVA_OPTS环境变量设置的地方。堆内存-Xms4g -Xmx8g根据服务器物理内存设置建议初始和最大设为相同值以避免动态调整开销。垃圾回收器JDK8下可使用-XX:UseG1GC。JDK11可以考虑ZGC或Shenandoah需根据TongWeb兼容性测试。GC日志添加-Xlog:gc*:file/opt/tongweb/logs/gc.log:time,uptime,level,tags:filecount10,filesize100M以便问题排查。元空间-XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m防止元空间溢出。3. 日志配置确保JeecgBoot的日志Logback输出到文件并且日志文件路径不要放在WAR包内或临时目录。修改logback-spring.xml将FILEappender的路径指向一个固定的外部目录如/opt/tongweb/logs/jeecg-app.log。同时在TongWeb控制台配置应用自身的日志级别和输出。4.4 前端资源部署分离与合并方案实操方案一合并部署已在前端构建步骤中完成如果你已经将Vue3的dist内容复制到了后端静态资源目录那么WAR包内已经包含了前端。部署后直接访问http://tongweb-server:8080/jeecg-boot/即可看到前端页面。所有前端发起的API请求都会自动指向这个相同域名和上下文路径下的后端接口不存在跨域问题。方案二分离部署Nginx配置假设Nginx安装在/usr/local/nginx前端静态资源放在/data/www/jeecg-dist。将Vue3构建的dist文件夹内容上传到/data/www/jeecg-dist。配置Nginx (nginx.conf或conf.d/下的站点配置)server { listen 80; server_name your-domain.com; # 或服务器IP # 前端静态资源 location / { root /data/www/jeecg-dist; index index.html index.htm; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } # 反向代理后端API location /jeecg-boot/ { proxy_pass http://tongweb-server:8080/jeecg-boot/; # TongWeb应用地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 如果TongWeb应用需要较长时间处理可调整超时 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 300s; # 某些导出或大数据查询接口可能需要更长时间 } }重启Nginxnginx -s reload。此时用户访问http://your-domain.com看到前端前端所有发往/jeecg-boot/的请求都会被Nginx转发到后端的TongWeb服务器。5. 部署后验证与性能调优5.1 基础功能验证清单应用启动后不要急着交付按顺序进行以下检查应用状态在TongWeb控制台确认应用状态为“活动”且无严重错误日志。首页访问通过浏览器访问应用首页合并部署http://tongweb:8080/jeecg-boot/分离部署http://your-domain.com确保前端页面正常加载。登录功能尝试使用账号密码登录这是检验前后端通信、数据库连接、会话管理的综合测试。核心业务模块测试数据列表查询、新增、编辑、删除、导入导出等JeecgBoot的典型功能。在线开发功能如果使用了JeecgBoot的在线开发代码生成器、表单设计等测试其是否正常。文件上传下载测试系统内的文件上传功能确保上传路径有写入权限且文件能正确存储和访问。定时任务如果启用了Quartz或Spring Task定时任务观察日志看是否正常触发。5.2 TongWeb监控与性能洞察TongWeb的管理控制台提供了丰富的监控功能这是Tomcat所不具备的线程池监控查看“服务器”-“监控”-“线程池”观察HTTP线程池的使用情况。如果活跃线程数持续接近最大值可能需要调大maxThreads参数。JVM监控查看堆内存、非堆内存、GC次数和时间。关注老年代使用率是否持续增长Full GC是否频繁。数据源监控查看你配置的JNDI数据源的活跃连接数、空闲连接数。如果活跃连接数经常接近最大值可能数据库存在慢查询或连接泄漏需要优化SQL或调整连接池参数。请求统计可以查看不同URI的请求次数、平均响应时间、最大响应时间等帮助定位性能瓶颈接口。5.3 针对JeecgBoot的特定调优建议MyBatis-Plus二级缓存在集群环境下默认的MyBatis-Plus二级缓存基于内存会导致数据不一致。生产环境建议关闭二级缓存或使用Redis等集中式缓存替代。在application.yml中配置mybatis-plus.configuration.cache-enabled: false。Shiro/Spring Security会话配置如果使用集群需要将会话Session存储到Redis中实现会话共享。TongWeb自身也支持会话复制但使用Redis是更通用和推荐的做法。需要在JeecgBoot中配置Spring Session Redis。大文件上传与下载JeecgBoot默认的文件上传配置可能有限制。需要在application.yml中调整Spring Boot的相关参数spring: servlet: multipart: max-file-size: 500MB max-request-size: 500MB同时在TongWeb的对应HTTP连接器配置中也可能需要调整maxPostSize等参数。SQL监控与慢查询启用Druid数据源监控如果使用Druid或使用P6Spy打印SQL日志结合TongWeb的数据源监控找出慢SQL并进行优化。6. 常见问题与故障排查实录在实际部署和运维中肯定会遇到各种问题。这里记录几个我踩过的坑和解决方法。6.1 应用启动失败类问题问题1ClassNotFoundException或NoClassDefFoundError现象应用启动时在TongWeb日志中报出某个类找不到。排查检查WAR包的WEB-INF/lib目录看是否缺失相关的JAR包。检查TongWeb的共享库common/lib或server/lib中是否存在不同版本的相同类库导致冲突。JeecgBoot的依赖通常比较全建议优先使用WAR包内的库。确认是否错误地将某些依赖的scope设置成了provided导致打包时被排除但TongWeb又没有提供。解决确保所有必需依赖都打包进WAR或明确在TongWeb中提供了对应版本的库。对于冲突可以尝试在pom.xml中使用exclusions排除WAR包内不需要的版本。问题2JSP support not available或类似错误现象启动日志中提示JSP相关类缺失。原因JeecgBoot默认是前后端分离后端是纯API不涉及JSP。但某些间接依赖或TongWeb的默认配置可能触发了对JSP引擎的检查。TongWeb可能默认加载了JSP模块。解决这个警告通常可以忽略不影响纯API应用运行。如果确实想消除可以检查TongWeb中该应用的“Web模块”设置看是否有JSP相关的描述符被强制启用可以尝试禁用。或者确保项目中没有任何.jsp文件。问题3数据源连接失败现象应用能启动但登录或操作数据库时报连接池错误。排查首先在TongWeb控制台测试你配置的JNDI数据源连接是否成功。检查JeecgBoot配置文件中jndi-name的写法是否正确格式通常是java:comp/env/jdbc/你的数据源名。检查数据库服务器的防火墙是否开放了端口。检查数据库用户权限是否足够。解决确保TongWeb数据源配置无误且网络连通。可以在TongWeb服务器上用命令行工具如mysql或telnet测试数据库连通性。6.2 运行时性能与稳定性问题问题4应用运行一段时间后变慢或内存溢出现象系统运行初期正常几小时或几天后响应变慢甚至TongWeb抛出OutOfMemoryError。排查查看GC日志分析Full GC频率和耗时。频繁Full GC通常是内存泄漏或堆内存设置过小的标志。使用监控工具利用TongWeb的JVM监控观察堆内存老年代的使用趋势。如果只升不降很可能存在内存泄漏。生成堆转储在TongWeb的JVM参数中添加-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/to/dump.hprof在OOM时自动生成堆转储文件。然后用MATMemory Analyzer Tool等工具分析找出占用内存最多的对象和引用链。常见原因大对象或缓存不当例如将大量数据缓存在静态Map中且没有清除策略。数据库连接泄漏MyBatis操作未关闭SqlSession或编程不当未关闭Connection。线程局部变量ThreadLocal滥用使用后未及时remove()。解决根据分析结果修复代码。同时合理设置JVM堆大小并考虑引入Redis等外部缓存替代本地缓存。问题5上传大文件失败现象上传几十兆以上的文件时连接被重置或报错。排查检查JeecgBoot的multipart.max-file-size和max-request-size配置是否足够大。检查TongWeb的HTTP连接器配置。在TongWeb控制台找到对应的HTTP监听端口配置如http-listener-1查看并调整maxPostSize参数单位是字节例如52428800表示50MB。这个参数非常关键它限制了POST请求体的总大小包括文件和其他表单数据。检查Nginx如果用了的client_max_body_size配置。解决确保从浏览器到Nginx再到TongWeb最后到Spring Boot应用整个链路上的文件大小限制都已被适当调高。6.3 前端访问与跨域问题问题6分离部署时前端页面空白或JS/CSS加载404现象浏览器打开页面空白控制台报资源加载失败。排查检查Nginx的root目录配置是否正确/data/www/jeecg-dist下是否有index.html。检查JS/CSS文件的路径。Vue项目打包后资源路径可能带有哈希值。确保Nginx能正确服务这些文件。try_files $uri $uri/ /index.html;这行配置很重要它让Vue Router能接管前端路由。查看浏览器Network面板确认请求的URL是否正确映射到了Nginx。解决修正Nginx配置路径并确保文件权限正确Nginx进程用户有读取权限。问题7分离部署时前端请求后端API出现404或跨域CORS错误现象前端页面能打开但登录或请求数据时失败浏览器控制台报CORS错误或404。排查404错误检查Nginx的proxy_pass地址是否正确是否包含了正确的上下文路径/jeecg-boot/。尾部的/有时很重要。CORS错误即使前后端在同一域名下不同端口也可能因TongWeb未配置CORS头而报错。但更常见的原因是Nginx的proxy_pass配置正确但JeecgBoot后端自身也需要配置CORS。对于分离部署必须在JeecgBoot后端启用CORS支持。解决 在JeecgBoot的后端项目中添加一个全局CORS配置类import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) // 生产环境建议替换为具体的前端域名 .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }同时确保Nginx的proxy_set_header配置正确传递了来源等信息。部署和运维是一个持续的过程尤其是在国产化环境下需要更多的耐心和细致的测试。每次配置变更后做好记录并在测试环境充分验证后再上生产。这套JeecgBoot on TongWeb的方案经过多个项目的实践在稳定性和性能上都是经得起考验的。