Tomcat Docker容器部署Calatena出现javax.servlet类未找到错误
问题根因
- 本地Tomcat运行正常是因为本地环境的
lib或lib/ext目录下存在ServerRealm类对应的依赖包(大概率是应用自定义的安全域实现包,或是SAP环境专属依赖),官方开源Tomcat镜像默认不带这类非标准依赖,因此类加载时报错。 - Tomcat 8部署时直接删除
catalina.properties和tomcat-users.xml属于错误操作:这两个是Tomcat核心配置文件,删除后默认类加载路径、安全域配置全部失效,直接导致运行异常。 - 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
相关产品推荐
相关产品推荐

