You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat Docker容器部署Calatena出现javax.servlet类未找到错误

问题根因

  1. 本地Tomcat运行正常是因为本地环境的lib或lib/ext目录下存在ServerRealm类对应的依赖包(大概率是应用自定义的安全域实现包,或是SAP环境专属依赖),官方开源Tomcat镜像默认不带这类非标准依赖,因此类加载时报错。
  2. Tomcat 8部署时直接删除catalina.properties和tomcat-users.xml属于错误操作:这两个是Tomcat核心配置文件,删除后默认类加载路径、安全域配置全部失效,直接导致运行异常。
  3. Tomcat 9部署时直接拷贝本地Windows环境的完整lib目录、全量覆盖配置文件的操作会引发环境冲突:本地和容器的操作系统、路径规则、基础依赖版本都存在差异,额外拷贝的Windows专属setenv.bat在Linux容器内完全无效,反而会打乱类加载逻辑,导致应用完全无法启动。

解决方案

步骤1:梳理本地可用依赖与配置

先从你本地正常运行的Tomcat环境中提取必要的自定义内容,不要全量拷贝默认文件:

  • 到本地Tomcat的lib、lib/ext目录下,筛选出非官方默认的自定义Jar包,尤其是包含ServerRealm类的Jar文件,单独整理出来。如果该类是SAP环境专属,需要同步提取SAP客户端对应的依赖Jar。
  • 仅提取catalina.properties、tomcat-users.xml、server.xml中你自定义修改的配置项,不要直接用本地的全量配置覆盖容器内的默认配置。
  • 仅保留Linux环境可用的setenv.sh配置,删除Windows专属的setenv.bat。

步骤2:编写标准化Dockerfile构建镜像

不要用docker cp手动修改运行中容器的内容,直接通过Dockerfile构建可复现的镜像,示例如下:

# 基础镜像选择和本地完全一致的版本,避免版本兼容问题,示例为9.0.43对应JDK8
FROM tomcat:9.0.43-jdk8

# 拷贝整理好的自定义依赖Jar到Tomcat公共类路径
COPY ./custom-libs/*.jar /usr/local/tomcat/lib/

# 拷贝仅修改了必要配置项的配置文件
COPY ./custom-conf/catalina.properties /usr/local/tomcat/conf/
COPY ./custom-conf/tomcat-users.xml /usr/local/tomcat/conf/
COPY ./custom-conf/server.xml /usr/local/tomcat/conf/

# 拷贝Linux可用的JVM参数配置文件并赋予执行权限
COPY ./custom-bin/setenv.sh /usr/local/tomcat/bin/
RUN chmod +x /usr/local/tomcat/bin/setenv.sh

# 拷贝应用War包
COPY ./calatena6.war /usr/local/tomcat/webapps/

步骤3:SAP环境适配

如果是部署到SAP官方容器环境,建议优先使用SAP官方提供的Tomcat基础镜像,避免开源镜像缺少SAP专属依赖的问题。


内容的提问来源于stack exchange,提问作者Nenad Kalicanin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:39:02