Есть ли способ выполнить заказ на развертывание в tomcat6?
У меня есть 3 войны в моей папке webapp. Два из них построены на сервисах третьего. Я в тестовой среде, т.е. У меня нет контроля над их архитектурами, поэтому я не могу ничего изменить. Так что...
Вопрос: Есть ли способ обеспечить выполнение заказа на развертывание в tomcat?
Я столкнулся с одним вопросом здесь в stackoverflow, но там нет решения.
Ну, на самом деле парень предполагает, что смена имени webapps в алфавитном порядке поможет. Тем не менее, я не хочу этого делать каждый раз, когда мне нужно проверять эти и разные войны.
Я уверен, что есть способ сделать это, настроив один из файлов tomcat conf.xml. Я просто не знаю, какой из них.
Ответы
Ответ 1
Из Tomcat Wiki - Какой порядок запуска веб-приложений (или Как изменить порядок запуска)?
Ожидаемый порядок запуска не ожидается. Ни сервлета, ни Tomcat определяет один. Вы не можете полагаться на приложения, начиная с любого конкретный порядок.
В Tomcat поддерживается никогда, определяющее порядок загрузки webapps. Существуют и другие контейнеры, такие как JBoss, но Tomcat никогда не имеет. Любое видимое поведение, которое выглядит как упорядочение загрузки в алфавитном порядке имен веб-приложений, является случайным и не гарантируется, что оно работает во всех случаях.
То, о чем вы, вероятно, думаете, это элемент <load-on-startup/>
, если web.xml
, который определяет порядок загрузки servlets
.
Это говорит о элегантном решении, использующем протокол обнаружения службы.
Одним из решений является использование чего-то вроде ZeroConf и регистрация ваших сервисов при запуске, а затем поиск зависимых приложений, когда эти службы доступны, и они подключаются и делают то, что когда-либо им нужно делать, когда служба готова. Вот как я уже много лет обрабатываю несколько зависимых сервисов. У меня есть службы Python, Java и Erlang, все открывающие друг друга через ZeroConf кажутся безразличными.
Ответ 2
Верно, что tomcat не предоставляет никакого способа для обеспечения порядка развертывания.
* Tomcat развертывает webapps в следующем порядке: *
1. Каждый дескриптор контекста будет развернут первым.
2. Затем будут развернуты развернутые веб-приложения, на которые не ссылается любой дескриптор контекста. Если у них есть связанный файл .WAR в базе приложений и он является более новым, чем взорванное веб-приложение, взорванный каталог будет удален, а webapp будет перераспределен из .WAR
3.WAR файлы будут развернуты
> Вот предлагаемое решение:
Если вы хотите указать порядок развертывания, укажите контекст для своего веб-приложения в $CATALINA_BASE/conf/[enginename]/[hostname]/MyApp.xml
Tomcat сканирует $CATALINA_BASE/conf/[enginename]/[имя_хоста]/путем выполнения File listFiles(), который возвращает массив файлов, отсортированный по хэш-значению (зависит от ОС).
Вы можете использовать следующий код, чтобы проверить, в каком порядке будет развертываться Webapps
File file = new File("/opt/tomcat/conf/Catalina/localhost");
File[] files = file.listFiles();
for (File f : files)
{
System.out.println("Filename: " + f.getName());
}
Ответ 3
Существует три способа развертывания webapp.war
в Tomcat.
-
Добавить Context
элемент внутри элемента Host
в файле $CATALINA_BASE/conf/server.xml
.
<Server><Service><Engine><Host>
<Context path="[webappName]" docBase="[webappPath]"/>
</Server></Service></Engine></Host>
-
Создайте файл $CATALINA_BASE/conf/[engineName]/[hostName]/[webappName].xml
с контентом:
<Context docBase="[webappPath]"/>
-
Добавьте файл webapp.war
непосредственно в каталог $CATALINA_BASE/webapps/
.
При запуске Tomcat произойдет следующая последовательность развертывания:
1 → 2 → 3
Некоторые объяснения:
-
$CATALINA_BASE
Обратитесь к базовому каталогу, с которым разрешены наиболее относительные пути. Если вы не настроили Tomcat для нескольких экземпляров, установив каталог CATALINA_BASE, тогда $CATALINA_BASE будет установлено значение $CATALINA_HOME, каталог, в который вы установили Tomcat.
-
docBase
Путь к файлу WAR веб-приложения. Вы можете указать абсолютный путь для этого файла WAR или путь, относящийся к каталогу appBase владельца Host.
-
engineName:
Название движка, связанного с контекстом. Имя по умолчанию Catalina
.
-
Hostname:
Имя хоста, связанного с контекстом. Имя по умолчанию localhost
.
Предположим, что:
- существует 3 webapps:
a.war
, b.war
и c.war
.
-
b.war
зависит от a.war
.
-
c.war
зависит от b.war
.
- Server.Service.Engine.name = "Catalina"
- Server.Service.Engine.Host.name = "localhost"
- Server.Service.Engine.Host.appBase = "webapps"
Попробуйте выполнить следующие действия:
- Поместите все военные файлы в каталог
$CATALINA_BASE/webapps/
.
-
создайте файл $CATALINA_BASE/conf/Catalina/localhost/b.xml
с содержимым:
<Context docBase="b.war"/>
-
Добавьте Context
элемент в файл $CATALINA_BASE/conf/server.xml
:
<Server><Service><Engine><Host>
<Context path="a" docBase="a.war"/>
</Server></Service></Engine></Host>
Ссылка:
Ответ 4
Извинения за перекрестную проводку (Tomcat - запуск webapps в определенном порядке), но я подумал, что это тоже актуально:
Вы можете определить сервисы mulitple в файле server.xml, который выполняется на разных портах. Сервисы запускаются последовательно в соответствии с порядком их появления в файле server.xml. Это означает, что у вас может быть - например, служба конфигурации, работающая в первой службе, а затем приложения, зависящие от нее во второй (я использую по умолчанию Catalina для остальных)
Вы можете увидеть больше информации здесь:
http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27
И это сервис, который я включаю перед службой Catalina:
<Service name="ConfigService">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444" />
<Engine name="ConfigServiceEngine" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" reloadable="true" docBase="/path/to/your/service/directory" />
</Host>
</Engine>
</Service>
Как вы можете видеть, я использую docbase, а не appBase, но вы можете настроить другую базу приложений, если хотите...
NB важно изменить имя службы и движка.
НТН
Ответ 5
Вы всегда можете перенести первый .war файл в каталог tomcat, затем дождитесь его развертывания, а затем переместите следующие два в каталог tomcat. Это будет развертывание первого, а затем развертывание двух других.
В качестве альтернативы вы можете использовать тот факт, что Tomcat сканирует каталог и развертывает первую войну, затем вторую войну, затем третью войну в алфавитном порядке
Ответ 6
Это довольно легко достичь, если вам не нравится взломать код tomcat и создать собственный экземпляр хоста
1) Создайте подкласс из org.apache.catalina.core.StandardHost, скажем, MyHost:
class MyHost extends org.apache.catalina.core.StandardHost{
public MyHost (){
super();
//changing HashMap for a predictable ordered Map :)
this.children = new LinkedHashMap();
}
}
2) зарегистрируйте свой класс на своем сервере xml Host tag()
Невероятный, как может показаться, он решает проблему, пока у вас есть все ваше веб-приложение, объявленное в правильном порядке внутри тега Host:
<Host>
<context app1>
<context app2>
Thaen app1 начнется до приложения2, независимо от того, какой SO вы использовали.
Ответ 7
Мы запускаем несколько кошек. Мы можем создавать группы приложений независимо, помещая первую группу в один кота и более поздние из них.
Это предполагает, что они не пытаются связываться друг с другом с помощью JVM.