【问题标题】:ClassNotFoundException for class in context.xml while jar is in lib folder of catalina homejar 在 catalina home 的 lib 文件夹中时 context.xml 中的类的 ClassNotFoundException
【发布时间】:2020-12-25 21:21:30
【问题描述】:

我正在关注this tuturial,以使我当前的检票口项目与 Redis 会话管理一起使用。 但是,我不能让我的 context.xml 工作。 我正在从两个文件 CatalinaRedisSessionStore 和 RedisCache 制作一个 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>

我在 docker 容器中运行我的应用程序,使用 azul/zulu-openjdk-alpine:11

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

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

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 /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后,文件夹结构如下:

【问题讨论】:

  • ”在那里做什么?
  • 这是文件所在的路径。它包含产品的名称,我不能在论坛上给出。将更新它以防止混淆
  • &lt;path&gt;. 肯定是错误的,&lt;&gt; 都不是“包标识符”的有效字符。 ..假设您编译了原始示例,请尝试className="CatalinaRedisSessionStore"
  • 刚刚调整了
  • 好的,..i 也是确切的错误信息 :)

标签: java docker tomcat redis wicket


【解决方案1】:

我假设您复制到 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

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多