Определить контекст сервлета в WAR-файле - PullRequest
24 голосов
/ 07 апреля 2010

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

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

Добавление файла context.xml в META-INF не дало желаемых результатов

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

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

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

Есть еще подсказки?

Ответы [ 4 ]

30 голосов
/ 08 апреля 2010

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

  • В отдельных файлах (с расширением ".xml") в *Каталог 1007 *. Имя файла (без расширения .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.

Здесь я вижу два варианта:

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

    <project>
      ...
      <build>
        <finalName>mycontext</finalName>
        ...
      </build>
      ...
    </project>
    
  2. Или используйте 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>
    
5 голосов
/ 03 июня 2013

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

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

Ex. :

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

Эктор

4 голосов
/ 07 апреля 2010

Вы можете установить атрибут 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>
2 голосов
/ 07 апреля 2010

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

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