Docker Tomcat 镜像 : Encoding problem with Umlaute when deploying WAR file

标签 docker tomcat gradle encoding utf-8

我有一个部署在 Tomcat 8.5 上的简单(无 spring)Web 应用程序(REST 服务 + HTML 页面)。

如果我将应用程序源代码放入 docker 容器(来自 java:8-jdk 的纯 java 镜像),使用 gradle 在使用 gretty 创建的嵌入式 Tomcat 上构建和运行它,一切正常。

但是,当我使用带有预装 Tomcat 的 docker 镜像(来自 tomcat:8.5)并部署 myApp.war(由 gradle war 插件生成)时,编码变得困惑,像“ü”这样的变音符号显示为“ü” .

但这只发生在使用 Javascript 库“toastr”显示为 toast 的消息以及我使用“javax.mail.Transport”发送的电子邮件的主题部分。 html 页面的内容和邮件的内容按预期显示变音符号。

所有文件都以 UTF-8 编码(例如 Java 源代码)。 我试图将 docker 容器上的区域设置更改为 de_DE.UTF-8,但这没有帮助(它也已经设置为 en_US.UTF-8,所以我想这不是问题所在)。 我还尝试了设置“JAVA_OPTS=-Dfile.encoding=UTF-8”的 bitnami-docker-tomcat 图像,但这也没有帮助。 我尝试向 web.xml 添加一个字符编码过滤器。也不走运。

我想这一定是一种常见问题,但我找不到可行的解决方案。

我的 Dockerfile:

FROM tomcat:8.5
ADD app.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]

带有编码过滤器的 web.xml:

<filter>
  <filter-name>setCharacterEncodingFilter</filter-name>
  <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>setCharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

最佳答案

看来我一直走错了路。问题既不是 docker 容器,也不是 Tomcat 配置。问题是 WAR 文件的创建出错了,没有使用 UTF-8。真的很奇怪,因为 gretty 应该使用相同的编译文件并产生相同的错误。

因此,在我的 gradle 构建脚本中添加以下内容后,所有变音符号最终都正确显示了:

compileJava.options.encoding = 'UTF-8'

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

关于Docker Tomcat 镜像 : Encoding problem with Umlaute when deploying WAR file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391384/

相关文章:

postgresql - 带有 Kubernetes 和 persistentDisk 的 Postgres

java - 从 webapp 执行外部 Java 程序

java - 如何将 "export"映射作为 Java EE 上的网站参数

java - Spring和Gradle构建:无此类属性:类的主类名称:org.gradle.api.internal.project.DefaultProject_Decorated

android - 执行 "Gradle version 1.10 is required. Current version is 1.12."时出现错误 "gradle wrapper"?

list - docker restart 容器失败 : "already in use", 但没有更多的 docker 镜像

laravel - Dockerfile不在Laravel中创建文件和文件夹

java - servlet 映射中的歧义

java - gradle 中的原生依赖

go - 如何使用GOLang官方镜像导入冷门包到Docker?