Это сложно. Вы ограничены соглашениями 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. Надеюсь, это поможет.