Исключение ClassNotFoundException для класса в context.xml пока jar находится в папке lib catalina home

#java #docker #tomcat #redis #wicket

#java #docker #tomcat #redis #калитка

Вопрос:

Я следую этому руководству, чтобы заставить мой текущий проект wicket работать с управлением сеансами Redis. Однако я не могу сделать свой context.xml работа. Я создаю JAR из 2 файлов, CatalinaRedisSessionStore и RedisCache, затем я помещаю этот jar в папку библиотеки tomcat.

После запуска моего приложения я получаю эту ошибку:

 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 находится в папке lib tomcat home, поэтому, согласно документам, этого должно быть достаточно для tomcat, чтобы найти класс. Ниже я поместил свой файл Dockerfile.

У кого-нибудь есть какие-либо подсказки, почему класс не может быть найден?

Dockerfile

 FROM azul/zulu-openjdk-alpine:11


RUN apk update amp;amp; apk add bash

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

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

RUN unzip /opt/application/Application*zip -d /opt/application amp;amp; rm /opt/application/Application*.zip amp;amp; chmod 775 /opt/application/apache-tomcat/bin/catalina.sh amp;amp; 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

Комментарии:

1. что там делает «<path>»?

2. Это путь, по которому находится файл. Он содержит название продукта, которое я не могу дать здесь, на форуме. Обновит его, чтобы предотвратить путаницу

3. <path>. определенно неверно, и ни < ни > не являются допустимыми символами для «идентификаторов пакетов». .. предполагая, что вы скомпилировали исходный образец, попробуйте className="CatalinaRedisSessionStore"

4. Исправил это только сейчас

5. хорошо, .. я также думаю, что это точное сообщение об ошибке 🙂

Ответ №1:

Я предполагаю, что файл Application *.zip, который вы копируете в образ Docker, содержит установку Tomcat.

Изменение вашего файла Dockerfile следующим образом должно решить проблему:

 FROM azul/zulu-openjdk-alpine:11

RUN apk update amp;amp; apk add bash

#set timezone to "Europe/Amsterdam"
RUN apk add tzdata amp;amp; 
    cp /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime amp;amp; 
    echo "Europe/Amsterdam" >  /etc/timezone amp;amp; 
    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 amp;amp; 
    rm /tmp/Application*.zip amp;amp; 
    mv /usr/local/apache-tomcat ${CATALINA_HOME} amp;amp; 
    chmod 775 ${CATALINA_HOME}/bin/catalina.sh amp;amp; 
    chmod 775 ${CATALINA_HOME}/bin/dockerstart.sh amp;amp; 
    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