准备对之前的一个若依的项目改点内容,结果启动时发现报错:Unable to start embedded Tomcat

一开始找到项目结构、项目设置中的 SDK,看到默认用的是 17,以为找到了原因,改成项目要求的 1.8(8)之后,还是无法启动项目。

使用这个报错信息在网上找半天,没有什么收获,甚至还有一篇里提出了 7、8 条的排除项目,都没有结果。查看详细的错误日志,发现后面还跟着很多很多个 Caused by,当时就在想,会不会真正的报错原因在最下面。找到最下面的一处 Caused by
org.redisson.client.RedisException: ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?

这个明显是 redis 连接的报错,本地 docker 安装的 redis 默认是没有密码的,所以 spring.redis.password: 我是跟其他 dev yaml 配置一样直接留空的。使用本地的 redis 无密码连接也没有任何问题。

网上搜索这个报错,都是让我去设置 redis 的密码,就没有解释为什么空密码不能连接的。没找到原因,就按照一些教程去修改 redis 密码:

# 进入 redis 命令行
# redis-cli
# 设置密码
127.0.0.1:6379> config set requirepass 123456
# 校验密码
127.0.0.1:6379> auth 123456

此时没有重启 redis,客户端就已经连不上了。添加密码后连接成功!

在 yaml 配置文件中添加 redis 密码,再次启动,此时不再是 redis 的报错了。

此时报错:java.sql.SQLSyntaxErrorException: Table ‘xxx.QRTZ_LOCKS’ doesn’t exist。很明确是表不存在。打开数据库发现,数据库里的表是 qrtz_locks 小写。那么现在问题就很明确了,就是本地的 mysql 5.7 表名区分了大小写。

百度 docker mysql 如何设置不区分表名大小写 第一条 AI 给出了结果:

百度 AI 回复

试错了一次才发现这一次的百度 AI 回复存在错误。配置项 lower_case_table_names=0这将告诉MySQL不要对表名进行转换,保持原样。,而我要的是不区分大小写,也就是要对表名统一转换为小写进行比较。操作如下:

# 编辑 mysql 配置文件
# vi /etc/mysql/my.cnf
# 在[mysqld]下添加以下配置
lower_case_table_names=1
# 重启 mysql 服务
# service mysql restart
# 登录进入到 mysql Shell 中
mysql> show variables like 'lower_case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 1     |
+------------------------+-------+
# 这说明设置成功了,当然也可以直接启动项目确认

至此项目启动成功!


之后测试将 redis 密码设置为空。config set requirepass '',在 auth '' 时报错:(error) ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?。这与项目启动时报的错一致,很奇怪!但我项目里无论是留空,还是设置 '' 都还是报这个错误,暂时不知道怎么处理这个 redis 空密码的情况。