V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fox0001
V2EX  ›  Java

关于 Spring Boot 采用 YAML 配置文件,不稳定的问题

  •  
  •   fox0001 · 2023-09-13 10:54:31 +08:00 · 909 次点击
    这是一个创建于 438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天部署 Spring Boot 项目时,发现 Tomcat 跑不起来。

    错误情况

    • Spring Boot 版本 2.6.6
    • application.yml 采用 Windows 换行格式
    • 项目部署在 Debian 11
    • Tomcat 版本 9.0.43
    • 以前一直是能跑的,这次发版,application.yml 添加了新的配置项
    • 另一个项目 B ,依赖相同的项目,几乎相同的 application.yml ,没有问题,甚至把项目 B 的 application.yml 复制过来,能跑起来

    Tomcat 日志显示 snakeyaml 读取配置文件报错:

    Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1024
    

    找了一圈,发现比较接近的问题是:

    ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1024 on large yml files after upgrading to Boot 2.6.4 and Spring Cloud 2021 .0.1 #30159

    解决方案

    最后找到两个解决方案:

    1. 删除application.yml上的所有注释
    2. application.yml保持所有注释,末尾添加一个空行

    相关疑问

    1. 以前遇到过类似的问题,统一修正了application.yml里的配置值,主要使用双引号或单引号,解决配置值出现的符号。但这次应该不是这个问题。
    2. 感觉 snakeyaml 不太稳定,特别是配置文件末尾再添加了一个空行就能解决。是因为版本旧吗?新版 snakeyaml 会不会更稳定一点?
    3. 如果不使用 YAML 格式,大家推荐什么格式?感觉可以考虑 JSON 格式,起码语法比 YAML 熟悉,但是对于动态值,不知道支持情况如何?
    ikas
        1
    ikas  
       2023-09-13 19:33:06 +08:00
    有没有对比最终打包后的编码?以前遇到过这个问题,是 idea 与 maven 配置的编码不一致问题导致的
    fox0001
        2
    fox0001  
    OP
       2023-09-14 13:03:41 +08:00 via Android
    @ikas #1 谢谢回复。配置文件的字符编码,应该是没问题的,都是 UTF-8 。目前怀疑文件里参杂了 Unix 和 Windows 的换行符。
    liuyunlong
        3
    liuyunlong  
       2023-09-15 10:31:55 +08:00
    会不会有这个可能,当你修改时所处的换行符格式出现了问题。例如 windows 修改 的换行符 。当然这只是建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1351 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 17:25 · PVG 01:25 · LAX 09:25 · JFK 12:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.