Развертывание моего приложения в корне в Tomcat

132

У меня есть военный файл моего заявления. Мне нужно развернуть это на корневом уровне. Текущий URL-адрес http://localhost:8080/war_name/application_name.

iamjustcoder
источник
1
Не могли бы вы уточнить, в чем именно ваша проблема? Когда вы развертываете файл war в tomcat, доступ к приложению осуществляется с помощью URL: localhost: 8080 / war_name без расширения .war.
ashishjmeshram
1
Да, вы правы, мне нужно получить доступ к моему приложению. " localhost / application_name ", это я могу получить, когда переименовываю свой военный файл в "ROOT.war", но это выбрасывает исключение из памяти, потому что мой размер военного файла составляет около 120 МБ
iamjustcoder
1
@ user661660 - Похоже, у вас другая проблема - переименование в ROOT.warдолжно работать. Я бы посоветовал задать еще один вопрос о вашем OutOfMemoryException, предоставив трассировку стека и детали. Вероятно, вы можете обойти это, настроив -XmxJVM.
Rob Hruska
.lang.OutOfMemoryError: пространство PermGen 16 марта 2011 г. 9:52:52 com.ebay.kernel.logger.Logger log СЕРЬЕЗНО: ошибка в потоке Perfmon java.lang.OutOfMemoryError: исключение пространства PermGen в потоке «CalClient: NotifyThreadDestroyThread-0 "java.lang.OutOfMemor yError: PermGen space Exception in thread" MetricsSnapshotScheduler "java.lang.OutOfMemoryError: PermG en space 16 марта 2011 г. 9:53:36 AM com.ebay.kernel.logger.Logger log СЕРЬЕЗНАЯ: ошибка в Perfmon thread java.lang.OutOfMemoryError: PermGen space Exception in thread «CalClient: NotifyThreadDestroyThread-0» java.lang.OutOfMemor yError: PermGen space
iamjustcoder
1
@ user661660 - Возможно, некоторые ответы на этот вопрос вам помогут.
Rob Hruska

Ответы:

220

У вас есть несколько вариантов:

  1. Удалите ROOT/готовый каталог из tomcat и переименуйте файл war в ROOT.warперед его развертыванием.

  2. Развертывание войны (из вашего примера) war_name.warи настроить корневой контекст в conf/server.xmlиспользовать военный файл:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>

Первый вариант проще, но немного сложнее. Второй способ, вероятно, более элегантный.

Роб Хруска
источник
3
Если Tomcat настроен на автоматическое развертывание, вам не нужно беспокоиться о варианте 2.
Бухак Синди,
4
@Dejel - Технически ничего. Я сам довольно много этим занимался; он выполняет свою работу. Просто кажется немного неудобным переименовывать свой собственный файл войны во что-то вроде детали реализации контейнера.
Rob Hruska
4
Согласно предоставленной вами ссылке НЕ рекомендуется размещать элементы <Context> непосредственно в файле server.xml
Nilesh
6
В этом ответе рекомендуется метод, который явно упоминается в документации как плохой. Правильный метод подробно описан здесь: stackoverflow.com/questions/41263245/…
Кристофер Шульц
5
+1 за то, что назвал это ROOT.war. Согласно документации Tomcat, вы должны быть очень осторожны при указании «пути», чтобы избежать двойного развертывания: «Даже при статическом определении контекста в server.xml этот атрибут не должен устанавливаться, если либо docBase не находится под хостом. appBase или оба варианта deployOnStartup и autoDeploy - false. Если это правило не соблюдается, вероятно, произойдет двойное развертывание ». - из tomcat.apache.org/tomcat-8.0-doc/config/context.html
Энтони Хейворд,
31

на tomcat v.7 (ванильная установка)

в вашем conf / server.xml добавьте следующий бит в конец файла, непосредственно перед </Host>закрывающим тегом:

<Context path="" docBase="app_name">
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Обратите внимание, что атрибут docBase . Это важный момент. Вы либо убедитесь, что развернули app_name, прежде чем менять корневое веб-приложение, либо просто скопируйте распакованное webapp (app_name) в папку webapps вашего Tomcat. Запуск, зайдите в root, увидите там ваше app_name!

Петер Перхач
источник
13

В tomcat 7 с этими изменениями я могу получить доступ к myAPP в / и ROOT в / ROOT

<Context path="" docBase="myAPP">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="ROOT" docBase="ROOT">
     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Добавьте выше в <Host>раздел server.xml

Судхир Палям
источник
3
Контекстный путь должен быть пустой строкой или начинаться с символа '/'. Путь [ROOT] не соответствует этим критериям и был изменен на [/ ROOT]
Никита Босик 01
11

Я знаю, что мой ответ частично совпадает с некоторым другим ответом, но это полное решение, которое имеет некоторые преимущества. Это работает на Tomcat 8:

  1. Основное приложение обслуживается из корня
  2. Развертывание файлов войны через веб-интерфейс сохраняется.
  3. Основное приложение будет работать на порту 80, в то время как только администраторы имеют доступ к папкам управления (я понимаю, что системы * nix требуют суперпользователя для привязки к 80, но в Windows это не проблема).

Это означает, что вам нужно перезапустить tomcat только один раз, и после обновленных файлов войны можно без проблем развернуть.

Шаг 1. В файле server.xml найдите запись коннектора и замените ее на:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

Шаг 2. Определите контексты в <Host ...>теге:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

Обратите внимание, что я обратился ко всем приложениям в папке webapp. Первый эффективно переключает рут и главное приложение из положения. ROOT теперь включен, http://example.com/ROOTи основное приложение включено http://example.com/. Для веб-приложений, защищенных паролем, требуется privileged="true"атрибут.

Когда вы развертываете файл CAS.war, который соответствует корневому каталогу ( <Context path="/" docBase="CAS">вам необходимо перезагрузить его в панели администратора, поскольку он не обновляется при развертывании.

Не включайте <Context path="/CAS" docBase="CAS">в свои контексты, так как он отключает параметр диспетчера для развертывания файлов войны. Это означает, что вы можете получить доступ к приложению двумя способами: http://example.com/иhttp://example.com/APP/

Шаг 3: Чтобы предотвратить нежелательный доступ к корневой папке и папке менеджера, добавьте valveк этим тегам контекста, например:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

Это существенно ограничивает доступ к папке веб-приложения администратора для людей из моего собственного домена (поддельный IP-адрес) и локального хоста, когда они используют порт по умолчанию 8080 и поддерживает возможность динамического развертывания файлов войны через веб-интерфейс.

Если вы хотите использовать это для нескольких приложений, использующих разные IP-адреса, вы можете добавить IP-адрес в соединитель ( address="143.21.2.1").

Если вы хотите запустить несколько веб-приложений из корневого каталога, вы можете продублировать тег службы (используйте другое имя для второго) и изменить базу документации, <Context path="/" docBase="CAS">например, на <Context path="/" docBase="ICR">.

KimvdLinde
источник
6

Самый быстрый способ.

  1. Убедитесь, что у вас не развернуто приложение ROOT, удалите его, если оно у вас есть

  2. Переименуйте свою войну в ROOT.war, разверните, и все, никаких изменений конфигурации не требуется

Дима
источник
6

Удалить $CATALINA_HOME/webapps/ROOT. Обновите $CATALINA_HOME/conf/server.xml, убедитесь, что элемент Host выглядит как следующий текст:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

Он работает с Tomcat 8. Для autoDeploy и deployOnStartup необходимо установить значение false, чтобы предотвратить повторное развертывание Tomcat myApp.

Цзинго Яо
источник
Я попытался загрузить WAR, но ничего не вышло. Это только для взорванных WAR?
logixplayer
Я попытался загрузить WAR, но он не сработал на примере @ Jingguo. Это только для взорванных WAR? РЕДАКТИРОВАТЬ: Это действительно ТОЛЬКО для взорванных войн. Почему это? Можно ли просто загрузить WAR и избежать этого двойного шага? Как я могу заставить это работать?
logixplayer
@logixplayer. Мое решение работает с WAR. Я не взорвал его. Я забыл упомянуть, что $CATALINA_HOME/webapps/ROOTнужно удалить. Удалите его и попробуйте еще раз.
Jingguo Yao
Я удалил ROOT как вы сказали. Я развернул свою WAR (не взорванный каталог). Я заметил, что был создан новый ROOT-каталог с моими данными, например WEB-INF. Сайт запущен. Это так, как должно работать?
logixplayer
Я также пробовал этот метод, и все, когда я пытаюсь открыть страницу в браузере, он просто ждет сервера. Catalina.out только сообщает, что сервер был запущен.
Asu
1

В дополнение к Sol @Rob Hruska, этот параметр в server.xml внутри секции работает:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

Примечание. В некоторых случаях может потребоваться override = "true".

AVM
источник
вы не упомянули, куда это положить. Ответ @Sudheer Palyam был полезен.
Каннан Рамамурти
1

Добавляя к ответу @Dima , если вы используете mavenдля создания своего пакета, вы можете указать ему установить имя файла WAR ROOTв pom.xml:

<build>
    <finalName>ROOT</finalName>
</build>

По умолчанию веб-приложение tomcatбудет развернуто ROOT.warв корневом контексте ( /).

Али Тоу
источник
0

откройте url-адрес диспетчера контактов: - http: // localhost: 8080 / manager / html /,
затем в приложениях вы увидите приложение, путь которого развернут в виде «/».
Просто отмените развертывание . Переименуйте файл war вашего приложения как ROOT.war и просто укажите путь: - запустите Tomcat Никакой дополнительной настройки не требуется. Теперь мы можем увидеть домашнюю страницу нашего приложения или настроенный URL по адресу http: // localhost: 8080.
введите описание изображения здесь
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps

Anurag_BEHS
источник
-1

На моем сервере я использую это, и автоматическое развертывание root работает нормально:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>
Мирча Станчу
источник
Это не будет развернуто в /, а в / mysite
tine2k 04