Разделение названия военной заявки на имя военного названия
В настоящее время, если я развертываю военный файл в tomcat с именем say myapp.war
, я могу получить доступ к его URL-адресу http://localhost/myapp/MyServlet.
Однако я хочу развернуть войну с номером версии в имени военного файла и по-прежнему иметь тот же url.
Например, я хочу развернуть myapp-1.1.0.war
и по-прежнему иметь url http://localhost/myapp/MyServlet
Конечно, мне нужно постоянно обновлять войну, и номер версии будет меняться, поэтому я не могу жестко указать военное имя файла где угодно.
Есть ли какая-либо настройка в web.xml
, которую я могу использовать для сохранения одного и того же URL-адреса для приложения независимо от имени военного файла?
Ответы
Ответ 1
Решение состоит в том, чтобы прекратить использование функции автоматического развертывания Tomcat, которая использует ярлык настройки "контекстного имени" (часть /myapp
URL-адреса) для части имени WAR файла до ".war".
Вместо этого извлеките содержимое WAR в файловую систему самостоятельно и настройте файл XML в TOMCAT_HOME/conf/[enginename]/[hostname]/[contextname].xml
, который указывает путь нужного контекста (например, /myapp
) на местоположение приложения на диске (например, /opt/webapps/myapp-1.1.0/
).
Справочные документы Tomcat дают хорошее объяснение того, как Tomcat автоматически развертывает приложения, и как вы можете настроить настраиваемую логику для сопоставления пути контекста к расположению файла приложения (есть несколько альтернативных способов установить это, кроме того, что я предлагаю выше).
Ответ 2
Для этого вы можете использовать YOUR_WAR/META-INF/context.xml. Вот пример:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/MyServlet"/>
Ответ 3
При использовании Maven вы можете управлять своим путем развертывания, выполняя следующие действия:
Tomcat 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>
...
Начните свой tomcat первым
Затем создайте и разверните приложение.
mvn clean install tomcat:deploy
.. он будет доступен под http://server:8080/myWebApp
Ответ 4
Для этого в файле web.xml нет настроек. Я не верю, что это можно установить внутри файла войны в кросс-контейнерном режиме - в спецификации вообще не упоминается об этом, поэтому каждый контейнер делает это по-другому. jboss-web.xml
, sun-web.xml
, context.xml
и т.д.
Ответ 5
Я столкнулся с той же проблемой, и действительно, как упоминалось @matt, Tomcat справочные документы дают хорошее объяснение того, как Tomcat автоматически развертывает приложения и как настроить настраиваемую логику для сопоставления пути контекста к расположению файла приложения.
В моем случае я использовал этот совет (в объяснении пути):
Даже при статическом определении Контекста в server.xml этот атрибут (/path) должен быть установлен не, если только docBase не находится под Host appBase или и deployOnStartup, и autoDeploy являются ложными. Если это правило не соблюдается, возможно, произойдет двойное развертывание.
поэтому в моем случае я переключил оба параметра deployOnStartup
и autoDeploy
на false, поэтому моя WAR (egaWAR) не была автоматически взорвана в директорию 'a' под webapps, а вместо этого в каталог 'b', к этим настройкам:
<Host name="localhost" appBase="webapps"
autoDeploy="false" deployOnStartup="false"
unpackWARs="true" deployIgnore="${ignore.context}">
<Context docBase="a" path="/b" />
</Host>
Ответ 6
Я предпочитаю использовать символы ## для обозначения версии *.war файлов в tomcat.
Например:
myapp.war
→ URL: http://localhost:8080/myapp/MyServlet
myapp##1.1.0
→ URL: http://localhost:8080/myapp/MyServlet (все тот же, потому что все символы после " ##" игнорируются tomcat)
Ответ 7
У меня есть файл войны, созданный maven. Военное имя файла содержит метку времени - я использую ## для доступа к метке времени. При создании нового военного файла он не занимает отметки времени. Часть моего pom.xml:
<build>
<finalName>myapp##${maven.build.timestamp}</finalName>
</build>