2012-03-01 2 views
20

Если развернуть военный файл в Tomcat, называемый, например Foo-бар-1.1.2.war, как я могу развернуть его так, чтобы он извлекается webapps/bar и его URL-адрес root: /bar/...?Развертывание войны файл Tomcat с другой путь

Мое намерение состоит в том, чтобы сохранить файл войны на сервере webapps с информацией о его версии, чтобы я знал, какая версия установлена, но перезаписывает предыдущую версию приложения.

Я могу развернуть военный файл, используя PSI Probe. Это позволит мне указать целевой контекст для веб-приложения. Однако это означает, что я потеряю любую информацию о версии в имени военного файла.

+0

Возможный дубликат [Разделение названия военной заявки от имени военного файла] (http://stackoverflow.com/questions/5875413/separating-war-application-name-from-war-file-name) – OhadR

ответ

23

Tomcat всегда будет извлекать содержимое военного файла в папку с тем же именем (когда он настроен на развертывание войн - по умолчанию и т. Д.).

Вы можете извлечь его в указанное вами имя папки. Поэтому, если вы разархивируете содержимое foo.war в папку с именем bar/ вручную, вместо того чтобы просто отбрасывать войну в папку веб-приложений, она все равно загрузит веб-приложение.

Однако это совершенно не нужно, как вы можете указать шаблон URL приложения, не портя с именем файла папка/войн на все переопределение корневого элемента контекста для приложения:

Это часто устанавливается в Tomcat server.xml - но эта практика довольно широко обескуражена. Вместо этого, я предлагаю вам использовать context.xml в META-INF папку вашего веб-приложения/войны файл:

<Context path="/bar" .../> 

При развертывании приложения, то context.xml должен быть скопирован в /conf/Catalina/localhost но переименованный в

Обратите внимание, что корни контекста должны быть уникальными, и есть некоторые дополнительные соображения, если вы используете операции autoDeploy или deployOnStartup (источник http://tomcat.apache.org/tomcat-7.0-doc/config/context.html).


Других варианты включают в себя:

  • Очистите веб-приложения папки каждое развертывания и забросьте новую foo-1.1.0 войны в
  • Включите номер версии в плоском файл.. foo/version1
  • Или просто укажите версию в файле config/XML.

Вы также можете использовать Ant (или эквивалентный инструмент) для автоматизации развертывания (и выполнить любое из указанных выше действий).

+0

Я думал, что может быть способом развернуть военный файл без ручного извлечения его содержимого, чтобы вы могли хранить информацию о своей версии, но развертывать его в существующем контексте. – z12345

+1

Какая версия вашего приложения связана с именем файла военного файла/приложения? – Mikaveli

+0

Я отредактировал вопрос в надежде, что он станет более ясным. – z12345

4

Если вы хотите включить информацию о версии в свое военное имя, вы можете назвать ее следующим: my-app##1.2.3.war. Он распаковывается в каталог my-app##1.2.3, но контекст будет всего my-app (т. Е. http://host/my-app/).

Работы по крайней мере, с Tomcat 7.0.55

+0

Чтобы развернуть это по URL-адресу, необходимо закодировать url-код #% на% 23, например. 'http: // localhost: 8080/manager/text/deploy? Path =/myapp% 23% 23v1.2.2.24% 20 (myName) & war = файл:/D: /RELEASE.Tomcat.wars/myapp%23 % 23v1.2.2.24% 20 (myName) .war ', иначе развертывание завершится неудачей с помощью исключения, не найденного в файле. – Max

7

Существует важный момент, чтобы подчеркнуть об атрибуте определения контекста фрагмента path. Процитировать documentation on the topic:

Когда autoDeploy или deployOnStartup операции выполняются с помощью хоста, имя и путь к контексту веб-приложения являются производными от имени (ы) файла (ов), которые определяют (s) веб-приложение.

deployOnStartupповедение по умолчанию Tomcat хостов.

Чтобы следовать документации, это имеет очень важное следствие:

путь контекста не может быть определена в META-INF/context.xml

По пути defining a Tomcat context, это позволяет только два решения:

  • In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory
  • Inside a Host element in the main conf/server.xml, что такое решение обескураженным в производственной среде, так как она требует перезагрузки сервера

Другое решение использует преимущества unpackWARs attribute.

С моей точки зрения, по этим причинам, общий и простой способ реализации тонкого пути в производственной среде заключается в использовании naming военных файлов (что может включать управление версиями и быть решением вашей проблемы). Один острый (например, тест # path.war) в именах военных файлов подразумевает сегмент в пути контекста (например, /тест/путь). Двойной острый вводит номер версии (например, test # path ## 112.war). Это работает независимо от того, распаковывают ли военные файлы, горячее развертывание или нет, агностик развертывания (менеджер или файловая система) и управляет несколькими версиями одного и того же архива.

Но если существует необходимость иметь путь, отличный от имени архива, представляется единственным решением является дескриптор в каталоге /conf/[enginename]/[hostname]/ или файл server.xml. Для этого вам необходим доступ к файловой системе сервера.

Соответствующее решение очень связано с тем, как Tomcat настроен и управляется в повседневной жизни.

+0

Я не уверен, что я делаю это правильно, но это похоже на правильный путь. Это делает столбец «версия» в приложении менеджера tomcat более разумным. Я пытаюсь копировать/перемещать приложения в webaps как 'cp /tmp/tds-5.0.0-alpha3.war thredds ## 500a3.war', чтобы сохранить номера версий для THREDDS. –

Смежные вопросы