Развертывание военного файла Tomcat другим путем
Если я разворачиваю военный файл в Tomcat, вызываемый, например, foo-bar-1.1.2.war, как его развернуть, чтобы он был извлечен в webapps/bar, а его URL-адрес - /bar/...?
Мое намерение состоит в том, чтобы сохранить файл войны на сервере webapps с его информацией о версии, чтобы я знал, какая версия установлена, но перезаписывает предыдущую версию приложения.
Я могу развернуть военный файл с помощью PSI Probe. Это позволит мне указать целевой контекст для веб-приложения. Однако это означает, что я потеряю любую информацию о версии в файле военного названия.
Ответы
Ответ 1
Tomcat всегда будет извлекать содержимое военного файла в папку с тем же именем (когда он настроен на развертывание войн - по умолчанию и т.д.).
Вы можете извлечь его в указанное вами имя папки. Поэтому, если вы разархивируете содержимое foo.war
в папку с именем bar/
вручную, вместо того, чтобы просто отбрасывать войну в папку веб-приложений, она все равно загрузит веб-приложение.
Однако это совершенно необязательно, поскольку вы можете указать шаблон URL-адреса приложения, не путаясь вообще с именем файла папки/войны, переопределив корневой элемент контекста для вашего приложения:
Это часто устанавливается в Tomcat server.xml
, но эта практика довольно широко обескуражена. Вместо этого я предлагаю вам использовать context.xml
в папке META-INF вашего веб-приложения/файла войны:
<Context path="/bar" .../>
Когда приложение развертывается, context.xml
следует скопировать в /conf/Catalina/localhost
, но переименовать в foo.xml
Обратите внимание, что корни контекста должны быть уникальными, и есть некоторые дополнительные соображения, если вы используете операции autoDeploy
или deployOnStartup
(Источник http://tomcat.apache.org/tomcat-7.0-doc/config/context.html).
Другие варианты:
- Очистите папку веб-приложений для каждого развертывания и отпустите новую войну
foo-1.1.0
.
- Включить номер версии в плоский файл.
foo/version1
- Или просто включите версию в файл config/XML.
Вы также можете использовать Ant (или эквивалентный инструмент) для автоматизации развертывания (и выполнить любое из указанных выше действий).
Ответ 2
Важно подчеркнуть атрибут path
определения фрагмента контекста. Для цитирования документации по теме:
Когда операции autoDeploy или deployOnStartup выполняются хостом, имя и путь к контексту веб-приложения выводятся из имен файлов, которые определяют веб-приложение.
deployOnStartup
- это поведение по умолчанию хостов Tomcat.
Чтобы следовать документации, это имеет очень важное следствие:
контекстный путь не может быть определен в META-INF/context.xml
Согласно способам определения контекста Tomcat, это позволяет использовать только два решения:
-
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
.
На мой взгляд, по этим причинам общим и простым способом реализации тонкого пути в производственной среде является использование имен файлов war (что может включать управление версиями и решение вашей проблемы). Один резкий (например, test # path.war) в именах файлов war подразумевает сегмент в пути контекста (например,/test/path). Двойной шрифт вводит номер версии (например, test # path ## 112.war). Это работает независимо от того, распаковывается ли файл war, горячее развертывание или нет, не зависит от развертывания (менеджер или файловая система) и управляет несколькими версиями одного и того же архива.
Но если необходимо /conf/[enginename]/[hostname]/
путь, отличный от имени архива, похоже, единственным решением является дескриптор в /conf/[enginename]/[hostname]/
или в файле server.xml
. Для этого вам необходим доступ к файловой системе сервера.
Соответствующее решение тесно связано с тем, как Tomcat настраивается и управляется каждый день.
Ответ 3
Если вы просто хотите включить информацию о версии в ваше имя файла war, вы можете назвать его следующим образом: my-app##1.2.3.war
. Он распаковывается в каталог my-app##1.2.3
но контекстом будет просто my-app
(то есть http://host/my-app/).
Работает как минимум с Tomcat 7.0.55
Ответ 4
Я применил проверенный ответ, который не очень помогает, я вручную развертывал файл war. Он не работал по умолчанию, только развертывание каталога tomcat webapps, если любой из приведенных в качестве примера решения означает, что это всегда приветствуется.