jar在catalina主页的lib文件夹中时,context.xml中类的ClassNotFoundException

问题描述

我正在关注this tuturial,以使我当前的wicket项目与Redis Session Management一起工作。 但是,我无法使context.xml正常工作。 我正在用CatalinaRedisSessionStore和RedisCache 2个文件制作一个JAR,然后将该jar放入tomcat的lib文件夹中。

启动我的应用程序后,出现此错误

SEVERE [main] org.apache.tomcat.util.digester.Digester.startElement Begin event threw exception
    java.lang.classNotFoundException: com.company.web.wicket.redis.CatalinaRedisSessionStore

我的context.xml看起来像这样:

<?xml version="1.0" ?>
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager"
             maxIdleBackup="1"
             minIdleSwap="0"
             maxIdleSwap="0"
             processExpiresFrequency="1"
             saveOnRestart='true'>
        <Store className="com.company.web.wicket.redis.CatalinaRedisSessionStore"/>
    </Manager>
</Context>

我正在使用azul/zulu-openjdk-alpine:11

在docker容器中运行我的应用程序

当我检查docker容器时,jar文件位于tomcat主页的lib文件夹中,因此根据足以使tomcat找到该类的文档。我在下面放了我的Dockerfile。

有人知道为什么找不到该类吗?

Dockerfile

FROM azul/zulu-openjdk-alpine:11


RUN apk update && apk add bash

#set timezone to "Europe/Amster@R_404_6421@"
RUN apk add tzdata && cp /usr/share/zoneinfo/Europe/Amster@R_404_6421@ /etc/localtime && echo "Europe/Amster@R_404_6421@" >  /etc/timezone && apk del tzdata

copY /build/distributions/Application*.zip /opt/application/

RUN unzip /opt/application/Application*zip -d /opt/application && rm /opt/application/Application*.zip && chmod 775 /opt/application/apache-tomcat/bin/catalina.sh && chmod 775 /opt/application/apache-tomcat/bin/docker-healthcheck.sh

workdir /opt/application/apache-tomcat

EXPOSE 8080 9875 9000

# Define default command.
CMD ["/opt/application/apache-tomcat/bin/dockerstart.sh","arg1"]

HEALTHCHECK --interval=1m --timeout=10s --retries=3 --start-period=2m CMD /opt/application/apache-tomcat/bin/docker-healthcheck.sh

执行jar xf redis_session.jar后,文件夹结构如下:

jar file structure

解决方法

我假定您复制到Docker映像中的Application * .zip文件包含Tomcat安装。

按如下所示更改Dockerfile应该可以解决问题:

FROM azul/zulu-openjdk-alpine:11

RUN apk update && apk add bash

#set timezone to "Europe/Amsterdam"
RUN apk add tzdata && \
    cp /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime && \
    echo "Europe/Amsterdam" >  /etc/timezone && \
    apk del tzdata

COPY /build/distributions/Application*.zip /tmp/

# Setting CATALINA_HOME and updating the PATH env vars is crucial
# since you use an inofficial Tomcat base image
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH ${CATALINA_HOME}/bin:${PATH}

# The default path of Tomcat is /usr/local/tomcat
# So,it's a good idea to extract your application to that folder
# rather than to a custom one to avoid an unexpected behaviour of the Tomcat
RUN unzip  /tmp/Application*.zip -d /usr/local && \
    rm /tmp/Application*.zip && \
    mv /usr/local/apache-tomcat ${CATALINA_HOME} && \
    chmod 775 ${CATALINA_HOME}/bin/catalina.sh && \
    chmod 775 ${CATALINA_HOME}/bin/dockerstart.sh && \
    chmod 775 ${CATALINA_HOME}/bin/docker-healthcheck.sh

WORKDIR ${CATALINA_HOME}

EXPOSE 8080 9875 9000

# Define default command.
# Everything inside /usr/local/tomcat/bin is exposed through the $PATH env var we defined at the beginning. 
# So we can access them globally without having to specify the exact script path
CMD ["dockerstart.sh","run"]

HEALTHCHECK --interval=1m --timeout=10s --retries=3 --start-period=2m CMD ${CATALINA_HOME}/bin/docker-healthcheck.sh