微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Liberty 和 OpenLiberty 控制台/消息编码为 UTF-8

如何解决Liberty 和 OpenLiberty 控制台/消息编码为 UTF-8

我正在使用 OpenLiberty(通过其 maven 插件自动下载)并且我的应用程序运行良好(jax-rs 和 servlet/jsp 输出正常)。

但是控制台(和messages.log)输出很乱。下面是一个例子:

[INFORMAıåES] SRVE0253I: [io.openliberty.microprofile.health.3.0.internal] [/health] [HealthCheckServlet]: Destrui?Æo bem sucedida.

(预期为 [INFORMAÇÕES] ... Destruição bem sucedida.

很明显,这些消息在支持 UTF-8 的终端中被打印为 ISO-8859-1。

同样,这个问题与在 OpenLiberty 容器中运行的应用程序无关,它完全是 UTF-8 并且工作正常。 关于控制台输出

一个部分有用的解决方法是将其区域设置更改为 en-US(以便 OpenLiberty 的消息不需要任何特殊字符)。实际上,我更喜欢英文错误消息,因为它们更容易用谷歌搜索

我已经尝试过 LANG=en-US.UTF8LC_ALL=en_USLC_MESSAGES=en_US,但都无济于事。

项目的有效 pom.xml 已声明 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>。我项目中的每个文件都是 UTF-8。项目的 .editorconfig [*] charset = utf-8(因此 vscode 将每个新文件创建为 utf-8)。

我在 Windows 10 上使用 bash MINGW64_NT-10.0-18363 + ConEmu-Maximus5。LANG 认为 =pt_BR.UTF-8

更新

我已通过添加将语言环境设置为 en-US -Duser.language=en${server.config.dir}/jvm.options

老实说,我是通过liberty-maven-plugin做到的:

  <properties>
    ...
    <liberty.jvm.language>-Duser.language=en-US</liberty.jvm.language>
    ...
  </properties>

(对于 liberty-maven-plugin 本身,我已将 -Duser.language=en 添加MAVEN_OPTS

不幸的是,-Dfile.encoding=UTF-8 什么也没做。

更新 2

我还在 Arquillian 驱动的 junit 测试中运行 OpenLiberty。有趣的是,当由 arquillian 启动时,OpenLiberty 遵循 -Dfile.encoding=utf-8 设置。

对于 arquillian,它可以通过 arquillian.xml 进行配置:

<arquillian ...>
    <container qualifier="liberty_managed" default="true">
        <configuration>
            ...
            <property name="javaVmArguments">-Dfile.encoding=utf-8</property>
            ...
        </configuration>
    </container>
</arquillian>

或者在 ${server.config.dir}/jvm.options 中(就像我之前所做的那样):

-Dfile.encoding=utf-8

我的结论是-Dfile.encoding解决此问题的正确方法。但不知何故,当由 liberty-maven-plugin 推出时,它并没有受到尊重。我会仔细研究它的源代码

解决方法

更新的答案:这可以通过 JVM 选项进行配置。

请注意,通常 jvm.options 文件要求您每行使用一个选项。

如果想使用多个选项并使用 liberty-maven-plugin properties 来配置它们,您可以执行以下操作:

    <properties>
        <liberty.jvm.arg1>-Duser.language=pt</liberty.jvm.arg1>
        <liberty.jvm.arg2>-Duser.country=BR</liberty.jvm.arg2>
        <liberty.jvm.arg3>-Dfile.encoding=utf-8</liberty.jvm.arg3>
    </properties> 

(注意 arg1,arg2,arg3 后缀除了分配唯一的 Maven 项目属性名称外并没有真正被使用,但不会出现在 jvm.options 文件中)。

并且您的终端程序必须支持显示这些字符。例如。对于我在美国/英语安装中使用具有默认设置的 Git Bash 默认终端,除非单击窗口图标然后单击“选项”并添加以下内容,否则不会显示上述葡萄牙语配置中的字符:

Select UTF-8 character set

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。