Отделение имени приложения войны от имени файла войны - PullRequest
26 голосов
/ 04 мая 2011

В настоящее время, если я разверну военный файл на tomcat с именем скажем myapp.war, я смогу получить доступ к его URL по http://localhost/myapp/MyServlet.

Однако я хочу развернуть войну с номером версии в названии файла войны и по-прежнему иметь тот же URL. Например, я хочу развернуть myapp-1.1.0.war и все еще иметь URL-адрес http://localhost/myapp/MyServlet

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

Ответы [ 6 ]

14 голосов
/ 04 мая 2011

Решение состоит в том, чтобы прекратить использование функции автоматического развертывания Tomcat, которая использует ярлык для установки «имени контекста» (часть URL /myapp) для части имени файла WAR перед «.war».

Вместо этого извлеките содержимое WAR в файловую систему самостоятельно и установите файл XML на TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml, который указывает желаемый путь контекста (например, /myapp) на местоположение приложения на диске (например, /opt/webapps/myapp-1.1.0/).

Справочные документы Tomcat дают хорошее объяснение того, как Tomcat автоматически развертывает приложения, и как можно настроить настраиваемую логику для сопоставления контекстного пути с расположением файла приложения (тамЕсть несколько альтернативных способов установить это, кроме того, который я предлагаю выше).

8 голосов
/ 04 мая 2011

Вы можете использовать YOUR_WAR / META-INF / context.xml для этого. Вот образец:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyServlet"/>
4 голосов
/ 21 августа 2012

При использовании Maven вы можете контролировать путь развертывания, выполнив следующие действия:

Tomcat's conf / tomcat-users.xml:

<tomcat-users>
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>

  <user username="root" password="root" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

</tomcat-users>

~ / .m2 / settings.xml:

...
<server>
  <id>tomcat</id>
  <username>root</username>
  <password>root</password>
</server>
...

pom.xml:

...
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>myapp</artifactId>
  <version>1.1.0</version>
  <packaging>war</packaging>
...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>tomcat-maven-plugin</artifactId>
        <configuration>
          <!-- neglect /html below Tomcat7: -->
          <url>http://server:8080/manager/html</url>
          <!-- Refer to the server settings in your ~/.m2/settings.xml -->
          <server>tomcat</server>
          <path>/myWebApp</path>
        </configuration>
      </plugin>
      ....
    </plugins>
  </build>
...

Сначала начни свой кот Затем создайте и разверните свое приложение ..

mvn clean install tomcat:deploy

.. будет доступно под http://server:8080/myWebApp

1 голос
/ 01 ноября 2017

Я предпочитаю использовать символы " ## " для обозначения версии файлов * .war в коте.
Например:
myapp.war -> URL: http://localhost:8080/myapp/MyServlet
myapp##1.1.0 -> URL: http://localhost:8080/myapp/MyServlet (все то же самое, потому что все символы после " ##"игнорирует котик)

1 голос
/ 04 мая 2011

В web.xml нет настроек для этого. Я не верю, что это можно установить в файле военных действий в кросс-контейнере - в спецификации это не упоминается, так что каждый контейнер делает это по-своему. jboss-web.xml, sun-web.xml, context.xml и т. Д.

0 голосов
/ 09 ноября 2015

Я сталкиваюсь с той же проблемой, и действительно, как уже упоминалось @ matt , справочные документы Tomcat дают хорошее объяснение того, как Tomcat автоматически развертывает приложения, и как вы можете настроитьнастраиваемая логика для сопоставления пути контекста с местоположением файла приложения.

В моем случае я использовал этот совет (в объяснении «пути»):

Даже при статическом определении контекстав server.xml этот атрибут (/ path) должен быть установлен , а не , если только docBase не находится под appBase хоста или , а deployOnStartup и autoDeploy имеют значение false .Если это правило не соблюдается, вероятно, будет получено двойное развертывание.

, поэтому в моем случае я переключил deployOnStartup и autoDeploy в значение false, поэтому моя WAR (egaWAR) не была автоматической-расширяется в каталог «a» в веб-приложениях, но вместо этого в каталог «b», из-за следующих настроек:

<Host name="localhost"  appBase="webapps"
            autoDeploy="false" deployOnStartup="false" 
            unpackWARs="true" deployIgnore="${ignore.context}">

   <Context docBase="a" path="/b" />

</Host>
...