Есть ли способ выполнить заказ на развертывание в 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.