一、部署
1. 部署流程
详细部署步骤参照上篇文章 [seata-server-1.5.1-直接部署(整合nacos)、使用]
本来打算新写一篇的,误操作成修改原来的1.5.1直接部署文档了,咨询客服不能回滚到历史版本,所以1.5.1直接部署重写了一篇,链接如上
2. seata-1.5.2区别
下载路径
wget https://github.com/seata/seata/releases/download/v1.5.2/seata-server-1.5.2.tar.gz
默认支持MySQL8.0版本
seata-1.5.2支持MySQL8.0版本
二、启动报错的坑
1. 现象
按照上述1.5.1步骤全部部署完毕,结果启动时报错了NoClassDefFoundError
,很多人被这一步劝退
2. 分析原因
2.1 启动日志分析
不知道原因的情况下,首先只能看日志报的什么错,注意日志输出的seata启动命令
,注意到了一点-Dloader.path=../lib
加载 ../lib
路径的jar ,到这不禁有两个疑问:
1) …/lib下有什么?
2)1.5.2的打包和启动方式变了?
2.2 目录结构/打包方式 区别
-
带着上述疑问,先看下
seata-1.5.1
和seata-1.5.2
目录结构的区别:
-
得出结论
seata-1.5.2
打包方式变了:将依赖的jar包打到了外部目录 lib 中; 而seata-1.5.1
版本则是按传统方式 将依赖jar包打在了target/seata-server.jar
中 -
验证如下:
2.3 确定原因
从上述分析中可以看出来,seata 从1.5.2 开始,打包和启动方式变了,1.5.2起启动命令需要指定依赖jar加载路径为 安装包下的lib目录。
seata-server.sh
中的启动命令,-Dloader.path=../lib
用的是相对路径
,
只有在 seata包的 bin/路径下执行 seata-server.sh 才能正确获取到 lib 中的jar包正常启动
如下:
cd seata-1.5.1/bin/
./seata-server.sh
如果在其他路径下执行,则会出现上述
NoClassDefFoundError
错,因为执行shell所在路径的相对路径中 …/lib 不存在
3. 解决
3.1 方式一:修改seata-server.sh脚本(推荐)
vim seata-1.5.1/bin/seata-server.sh
找到 -Dloader.path=../lib
配置改为绝对路径: -Dloader.path=${BASEDIR}/lib
#备份原来的JAVA_OPT配置
JAVA_OPT="${JAVA_OPT} -server -Dloader.path=${BASEDIR}/lib ......
3.2 方式二:每次都到bin目录下执行seata-server.sh
自行验证即可,每次都切到bin路径下太麻烦了,个人不喜欢这种方式
4. 验证
在seata根路径下执行./bin/seata-server.sh
,查看启动日志
lib路径正确,且seata-1.5.2正常启动