#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 структура папок выглядит следующим образом:
Комментарии:
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