Подтвердить что ты не робот

Определить контекст сервлета в WAR файле

Как я могу сказать, например. Tomcat использовать определенный путь контекста при предоставлении моего WAR файла?

Пример: У меня есть файл войны, созданный maven build, и результирующее имя файла довольно длинное. Поэтому я не хочу, чтобы приложение менеджера tomcat использовало имя войны в качестве контекста.

Поставка context.xml в META-INF не принесла желаемых результатов

Я также нашел это в документации для атрибута path Context:

Значение этого поля не должно быть установлено, кроме статического определения Контекста в server.xml, поскольку оно будет выведено из имен файлов, используемых для файла контекста .xml или docBase.

Таким образом, не представляется правильным способом сказать серверу приложений, каков должен быть путь для моей WAR.

Другие подсказки?

4b9b3361

Ответ 1

В документации Контекстный контейнер есть два важных момента:

  • В отдельных файлах (с расширением ".xml" ) в каталоге $CATALINA_BASE/conf/[enginename]/[hostname]/. Имя файла (за исключением расширения .xml) будет использоваться в качестве пути к контексту. Многоуровневые контекстные пути могут быть определены с помощью #, например. foo # bar.xml для контекстного пути /foo/bar. Веб-приложение по умолчанию может быть определено с помощью файла ROOT.xml.
  • Только если файл контекста не существует для приложения в $CATALINA_BASE/conf/[enginename]/[hostname]/, в отдельном файле в /META-INF/context.xml внутри файлов приложения. Если веб-приложение упаковано в качестве WAR, то /META-INF/context.xml будет скопировано на $CATALINA_BASE/conf/[enginename]/[hostname]/ и переименовано в соответствии с контуром контекста приложения. Как только этот файл существует, он не будет заменен, если новая новая версия WAR с более новым /META-INF/context.xml будет размещена в базе хоста.

Итак, когда вы связываете META-INF/context.xml, файл переименовывается в имя WAR, и это имя становится контуром, независимо от любого path, определенного в элементе Context.

Я вижу здесь два варианта:

  • Либо установите имя сгенерированной войны на более короткое имя (я предлагаю использовать <finalName> над <warName>, который устарел AFAIK):

    <project>
      ...
      <build>
        <finalName>mycontext</finalName>
        ...
      </build>
      ...
    </project>
    
  • Или используйте maven-tomcat-plugin для развертывания и установите путь контекста в конфигурации плагина:

    <project>
      ...
      <build>
        ...
        <plugins>
          ...
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <configuration>
              <path>/mycontext</path>
            </configuration>
          </plugin>
          ...
        </plugins>
        ...
      </build>
      ...
    </project>
    

Ответ 2

Я нашел простое решение для сохранения имени файла войны и выбора контекстного пути.

Вам просто нужно развернуть свою войну за пределами хоста appBase и создать ссылку внутри каталога appBase.

Ex.

ln -sf ${CATALINA_HOME}/wars/myapp-0.0.8-SNAPSHOT.war ${CATALINA_HOME}/webapps/myapp.war

Эктор

Ответ 3

Вы можете установить атрибут path элемента <Context> вашего META-INF/context.xml.

В качестве альтернативы вы можете настроить maven для создания артефакта войны с пользовательским именем:

<build>
    <plugins>
         <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <warName>yourCustomWarName</warName>
            </configuration>
        </plugin>
        ........
    </plugins>
</build>

Ответ 4

В вашем проекте есть папка META-INF, в этой папке есть файл context.xml.

<?xml version="1.0" encoding="UTF-8"?>
<Context  path="/myproject" />