开发者社区 问答 正文

ACM JAVA客户端启动失败


提示日志:
java.lang.ExceptionInInitializerError: null
        at com.taobao.diamond.client.impl.DiamondEnv.<clinit>(DiamondEnv.java:1519)
        at com.taobao.diamond.client.impl.ServerHttpAgent.<clinit>(ServerHttpAgent.java:50)
        at com.alibaba.edas.acm.ConfigService.init(ConfigService.java:63)
        at com.fuliaoyi.config.DefaultAcm.run(DefaultAcm.java:28)
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:788)
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:778)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
        at com.fuliaoyi.Application.main(Application.java:19)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.nio.charset.UnsupportedCharsetException: GBK
        at java.nio.charset.Charset.forName(Charset.java:531)
        at com.taobao.middleware.logger.option.LogbackActivateOption.getSizeRollingAppender(LogbackActivateOption.java:131)
        at com.taobao.middleware.logger.option.Logback918ActivateOption.activateAppenderWithSizeRolling(Logback918ActivateOption.java:210)
        at com.taobao.middleware.logger.support.LoggerSupport.activateAppenderWithSizeRolling(LoggerSupport.java:161)
        at com.taobao.diamond.client.impl.LogUtils.<clinit>(LogUtils.java:32)
        ... 18 common frames omitted


linux ubantu
jdk

➜  /opt java -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)


操作系统 字符集

➜  /opt env | grep LANG
LANG=zh_CN.utf8
LANGUAGE=zh_CN.utf8

展开
收起
asdfasdfwe 2018-05-02 18:53:55 3240 分享 版权
阿里云 AI 助理回答

从提供的日志和环境信息来看,问题出在字符集不匹配上。具体来说,错误提示为 java.nio.charset.UnsupportedCharsetException: GBK,这表明程序尝试使用GBK编码,但该编码在当前环境中未得到支持。

尽管你的操作系统(Ubuntu)的字符集设置正确(LANG=zh_CN.utf8LANGUAGE=zh_CN.utf8),且JAVA_TOOL_OPTIONS也指定了UTF-8 (-Dfile.encoding=UTF-8),但某些Java应用或其依赖库可能硬编码了对GBK字符集的引用,导致了这个异常。

解决方案:

  1. 修改应用配置:如果是在你控制范围内的代码,检查是否有直接或间接指定使用GBK编码的地方,并改为使用UTF-8。这可能包括日志框架配置、网络请求处理、文件读写等部分。

  2. 系统环境变量:虽然你已经设置了正确的LANG和LANGUAGE环境变量,确认是否所有运行此Java应用的shell会话都继承了这些设置。有时,需要确保启动Java应用的脚本或服务管理器(如systemd, supervisor等)也正确传递了这些环境变量。

  3. JVM参数:你已经在使用 -Dfile.encoding=UTF-8 来指定JVM的文件编码,这是正确的做法。但是,由于某些库可能绕过了这个设置,考虑在启动参数中显式覆盖其他可能导致问题的编码设置。例如,对于特定的日志框架,可能有特定的配置项来指定日志文件的编码。

  4. 依赖库更新:检查使用的第三方库是否有更新版本解决了字符集兼容性问题。有时候,升级到最新版本可以避免此类问题。

  5. 临时解决方案:如果上述方法都无法立即实施,作为临时措施,可以在系统的locale配置中添加对GBK的支持,但这不是推荐的长期解决方案,因为可能会引入其他国际化问题。通常,统一使用UTF-8是更佳实践。

综上所述,主要解决思路是确保整个软件栈(包括应用程序、依赖库、系统环境)都统一使用UTF-8编码,以避免字符集冲突。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答