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

标签 java docker tomcat redis wicket

我正在关注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。
有人知道为什么找不到该类吗?
Docker文件
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后,文件夹结构如下:
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

关于java - jar在catalina主页的lib文件夹中时,context.xml中类的ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63777820/

相关文章:

go - 如何在实时应用程序 RethinkDB 上访问/安装/设置 Web 面板

Jenkins 从 docker 容器发布 HTML

java - 带有 <path>/</path> 和 JSESSIONID 的 cookie

web-applications - 部署在tomcat中的web应用,如何修改浏览器标题栏显示的logo?

java - 将entrySet流式传输到groupingBy而不是keySet

java - "Runtime.getRuntime().exec()"性能不好吗?

Java 查找数组中的所有组合,这些组合加起来等于特定数字

java - 何时/如何添加 ListView 适配器,它可以通过后退按钮恢复? (分段)

python - docker-py getarchive 目标文件夹

java - HTTP 404 资源未找到