nacos解析yaml文件报错:org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
springboot打包出来的jar包可直接运行,生产环境使用linux环境,直接启动没有任何问题,启动命令如下:
java -XX:+UseG1GC -XX:InitialHeapSize=2g -XX:MaxHeapSize=2g -XX:MaxGCPauseMillis=500 -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/home/arcana/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M -Dspring.cloud.nacos.config.server-addr=192.168.60.97:18848 -Dspring.cloud.nacos.discovery.server-addr=192.168.60.97:18848 -jar agent-manager-service.jar
一直以来都是通过IDEA启动工程,配置好nacos相关的配置后,通过IDEA直接启动也没什么问题。最近想要在本地通过jar包启动,测试一下其他功能,但是发现启动不了,报错:org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
通过堆栈发现是nacos解析yaml文件时报错,但是就很奇怪了,明明一样的命令,为何Linux和Windows的启动结果不一样,JVM不是跨平台的么?
原来问题出在编码上面,因为nacos的配置文件默认是UTF-8格式,而JVM默认编码格式(file.encoding)在Linux和Windows环境是有差异的,前者是UTF-8,但是后者是GBK,可通过System.getProperty("file.encoding")查看。所以Windows环境下会导致编码格式不匹配,问题定位到了,在命令中增加-Dfile.encoding=UTF-8即可。
java -XX:+UseG1GC -XX:InitialHeapSize=2g -XX:MaxHeapSize=2g -XX:MaxGCPauseMillis=500 -XX:+DisableExplicitGC -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/home/arcana/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M -Dspring.cloud.nacos.config.server-addr=192.168.60.97:18848 -Dspring.cloud.nacos.discovery.server-addr=192.168.60.97:18848 -Dfile.encoding=UTF-8 -jar agent-manager-service.jar
还有个问题,为何IDEA启动不会报错呢,IDEA也是在Windows环境中运行的啊?还得从启动命令中找答案,原来IDEA给所有的启动命令自动加上了-Dfile.encoding=UTF-8配置。
结论:Java的进程启动命令中,应该默认增加-Dfile.encoding=UTF-8配置,避免操作系统平台不同导致的不可预知的问题。