Загружать контекст / сервлет при запуске в Tomcat * БЕЗ * изменения дескриптора развертывания (web.xml) - PullRequest
3 голосов
/ 24 января 2009

Я получил файл foo.war от стороннего поставщика. Я определил контекст в моей конфигурации Tomcat, создав conf/Catalina/localhost/foo.xml, который содержит:

<Context docBase="/path/to/foo.war" ...> ... </Context>

Я хочу, чтобы Tomcat загрузил контекст foo при запуске. Но WEB-INF/web.xml (дескриптор развертывания) в файле foo.war не содержит <load-on-startup>, поэтому Tomcat ждет до первого запроса. Я действительно предпочел бы не распаковывать сторонние foo.war для редактирования их web.xml. Кроме того, мне придется делать это каждый раз, когда поставщик выпускает новую версию своего .war.

Есть ли какой-либо способ в конфигурации Tomcat сказать Tomcat загрузить контекст foo при запуске? Я знаю, что в элементе <Context> вы можете устанавливать параметры, env vars и т. Д. Без редактирования файла web.xml. Но я не могу найти в документации Tomcat ничего о загрузке при запуске.

1 Ответ

3 голосов
/ 24 января 2009

Это сложно. Вы ограничены соглашениями Tomcat и других контейнеров, поэтому нет простого решения.

Вы можете использовать глобальный web.xml для инициализации определенных сервлетов и / или JSP из .war, используя элемент <load-on-startup>. Это единственный известный мне способ принудительной загрузки при запуске без изменения файла .war или файла WEB-INF / web.xml внутри него. Обратите внимание, что вам может понадобиться инициализировать сервлеты и JSP, используя разные имена / пути, чтобы избежать конфликтов.

Конечно, выполнение этого означает, что вам нужно знать достаточно о .war, чтобы инициализировать приложение, что может означать просмотр его файла web.xml, чтобы определить, что загружать. Это может победить цель, так как это не совсем простой способ загрузки любого .war при запуске. Но немного поработав, вы могли бы написать скрипт, который извлекает необходимую информацию из файла .war в файле .war и автоматически добавляет ее в глобальный файл web.xml.

Теперь, если вы хотите рассмотреть возможность написания сценария для изменения файла .war, вы можете просто написать сценарий, который извлекает WEB-INF / web.xml из файла .war, добавляет <load-on-startup> дочерние элементы ко всем элементы <servlet> и обновляет .war с новой копией. Я не уверен, какую среду вы используете для запуска Tomcat, но вот пример сценария bash, который сделает эту работу:

#!/bin/sh

TEMPDIR=/tmp/temp$$
WARFILE=/path-to-tomcat/webapps/foo.war

mkdir -p $TEMPDIR/WEB-INF
pushd $TEMPDIR
unzip -qq -c $WARFILE WEB-INF/web.xml \
    | sed 's#</servlet>.*#<load-on-startup>99</load-on-startup></servlet>#' \
    > WEB-INF/web.xml
zip -f $WARFILE WEB-INF/web.xml
popd
rm -rf $TEMPDIR

Вы можете запустить этот скрипт или что-то подобное в рамках вашего запуска Tomcat. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...