1. 项目改造:从JAR到WAR的关键步骤
当你需要将Spring Boot项目部署到东方通TongWeb时,第一步就是把项目从默认的JAR包改为WAR包。这个改造过程看似简单,但有几个关键点需要注意。
首先,修改pom.xml文件。这里有三处必须改动的地方:
<!-- 1. 修改打包方式为war --> <packaging>war</packaging> <!-- 2. 排除内嵌Tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- 3. 配置maven-war-plugin插件 --> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin>启动类也需要做相应调整。继承SpringBootServletInitializer并重写configure方法是关键:
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }我遇到过不少开发者在这里踩坑。最常见的问题是忘记排除内嵌Tomcat,导致部署后出现类冲突。另一个常见错误是没配置failOnMissingWebXml参数,导致打包失败。记住,现代Spring Boot项目通常没有web.xml文件,所以必须将这个参数设为false。
2. WAR包构建与验证
完成项目改造后,接下来就是构建WAR包。执行mvn clean package命令后,你会在target目录下看到生成的WAR文件。这里有几个验证点需要注意:
- 检查文件大小:通常WAR包会比JAR包大一些,因为包含了更多Web容器相关的文件
- 解压检查结构:可以用unzip命令查看WAR包内部结构,确保WEB-INF目录存在
- 检查依赖:确保lib目录下没有Tomcat相关的jar包
一个常见的错误是前端资源放置位置不对。在Spring Boot项目中,静态资源应该放在以下位置之一:
- src/main/resources/static
- src/main/resources/public
- src/main/resources/META-INF/resources
我遇到过项目部署后前端页面404的问题,最后发现是因为开发团队把前端文件放在了src/main/webapp目录下,而这个目录在Spring Boot项目中默认是不被识别的。
3. TongWeb环境准备
在部署WAR包之前,需要确保TongWeb环境配置正确。以下是关键配置步骤:
字符集设置:这是中文环境下最常见的问题来源
- 进入TongWeb控制台(默认地址http://ip:9060/console)
- 找到"WEB容器配置" > "HTTP通道管理"
- 将URL编码格式和默认编解码字符集都设为UTF-8
内存参数调整:特别是部署大型应用时
- 编辑bin/external.vmoptions文件
- 添加或修改以下参数:
-Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m
HTTP方法支持:某些RESTful应用需要
- 修改conf/tongweb.xml
- 确保PUT和DELETE方法没有被禁用
我曾在项目中遇到PUT请求返回405错误的问题,花了半天时间才发现是TongWeb默认禁用了这些方法。修改配置文件后立即解决了问题。
4. 部署WAR包的两种方式
TongWeb支持两种主要的部署方式:控制台部署和命令行部署。每种方式各有优缺点。
4.1 控制台部署步骤
- 登录TongWeb控制台(默认账号thanos/thanos123.com)
- 进入"应用管理" > "部署应用"
- 选择"本机文件"上传WAR包
- 设置应用上下文路径(建议保持与WAR包名一致)
- 选择虚拟主机(默认server)
- 完成部署
控制台部署的优点是可视化操作简单,缺点是上传大文件时可能超时。我建议超过50MB的WAR包使用命令行部署。
4.2 命令行部署方法
进入TongWeb的bin目录,执行以下命令:
./commandstool.sh deploy \ --applocation /path/to/your.war \ --contextroot /yourapp \ --defaultvs server \ yourappname参数说明:
- --applocation: WAR包绝对路径
- --contextroot: 应用访问路径
- --defaultvs: 虚拟主机名
- 最后一个参数是应用名称
命令行部署适合自动化脚本集成,特别是在持续集成/持续部署(CI/CD)流程中。我在实际项目中使用Jenkins配合这个命令实现了自动化部署。
5. 常见问题排查指南
即使按照上述步骤操作,部署过程中仍可能遇到各种问题。以下是几个典型问题及解决方案:
5.1 内存溢出问题
症状:应用运行一段时间后崩溃,日志中出现OutOfMemoryError
解决方案:
- 修改bin/external.vmoptions文件
- 增加内存参数,例如:
-Xms2048m -Xmx4096m -XX:MaxMetaspaceSize=1024m - 重启TongWeb服务
5.2 中文乱码问题
症状:请求参数或响应内容出现乱码
解决方案:
- 确认TongWeb的HTTP通道编码设置为UTF-8
- 检查应用本身的字符编码设置
- 如果是GET请求乱码,可能需要修改URL编码格式
5.3 应用启动失败
症状:部署后应用状态显示"启动失败"
排查步骤:
- 查看logs/server.log日志文件
- 常见原因:
- 类冲突:检查是否有重复的jar包
- 数据库连接失败:检查连接配置
- 端口冲突:检查应用配置的端口是否被占用
5.4 静态资源404问题
症状:页面可以访问但CSS/JS等资源加载失败
解决方案:
- 检查资源文件是否被打包到WAR中正确位置
- 确认上下文路径配置正确
- 检查TongWeb的静态资源缓存设置
6. 多应用部署策略
当需要在同一台服务器上部署多个应用时,有两种主要方案:
6.1 多domain方式
这是官方推荐的方式,每个应用有独立的运行环境:
# 创建新domain ./domain.sh create yourdomain # 启动特定domain ./startservernohub.sh yourdomain优点:
- 应用完全隔离
- 端口自动递增(9060,9061,...)
- 独立日志文件
缺点:
- 占用更多内存资源
6.2 多HTTP通道方式
通过创建多个HTTP通道实现:
- 创建新的虚拟主机
- 创建新的HTTP通道并绑定到该虚拟主机
- 部署应用时选择对应的虚拟主机
优点:
- 资源占用较少
- 配置相对简单
缺点:
- 应用共享同一JVM
- 日志文件混合
在实际项目中,我通常建议对重要应用使用多domain方式,对小型辅助应用可以使用多HTTP通道方式。
7. 性能调优建议
部署成功后,还可以进行一些性能优化:
连接池配置:
- 调整TongWeb的线程池大小
- 根据应用特点设置合适的最大连接数
JVM调优:
- 根据服务器内存情况调整堆大小
- 选择合适的GC算法
静态资源缓存:
- 配置适当的缓存头
- 启用gzip压缩
会话管理:
- 对于集群环境,配置合适的会话复制策略
- 设置合理的会话超时时间
我曾经优化过一个性能很差的应用,通过调整线程池参数和JVM配置,将响应时间从2秒降低到了200毫秒左右。这说明适当的调优可以带来显著的性能提升。
8. 日常维护技巧
最后分享几个日常维护中的实用技巧:
日志管理:
- 定期清理logs目录下的日志文件
- 配置日志轮转策略
监控建议:
- 监控关键指标:内存使用、线程数、请求响应时间
- 设置合理的告警阈值
备份策略:
- 定期备份应用配置
- 备份重要的部署描述文件
升级注意事项:
- 先在小规模环境测试升级
- 做好回滚方案
- 检查兼容性列表
记住,任何配置修改后都需要重启TongWeb才能生效。在生产环境中,建议在低峰期进行重启操作,并确保有完善的监控可以快速发现问题。