问题描述
我正在使用 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.UTF8
、LC_ALL=en_US
和 LC_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 默认终端,除非单击窗口图标然后单击“选项”并添加以下内容,否则不会显示上述葡萄牙语配置中的字符: