Как установить контекстный путь веб-приложения в Tomcat 7.0

Я знаю, что могу переименовать свое веб-приложение (или его WAR-файл) в ROOT, но это ужасный способ сделать это, ИМХО. Теперь я проверил документ Tomcat, и он говорит

НЕ рекомендуется размещать элементы непосредственно в файле server.xml.

Поэтому я попытался сделать это другим методом, который он предложил.

Отдельные элементы контекста могут быть явно определены: в отдельном файле в /META-INF/context.xml внутри файлов приложения.

Итак, я создал /META-INF/context.xml со следующим кодом,

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/"/>

Но после развертывания, когда я перезапустил сервер, он все равно не смог загрузить контекст в "/", он все равно загрузил его с "/<WEB_APP_NAME>"

Любые указатели полезны.

14 ответов

Решение

Что вы можете сделать, это следующее;

Добавить файл с именем ROOT.xml в <catalina_home>/conf/Catalina/localhost/

Этот ROOT.xml переопределит настройки по умолчанию для корневого контекста установки tomcat для этого движка и хоста (Catalina и localhost).

Введите следующее в файл ROOT.xml;

<Context 
  docBase="<yourApp>" 
  path="" 
  reloadable="true" 
/>

Вот, <yourApp> это имя, ну, ваше приложение..:)

И вот, ваше приложение теперь является приложением по умолчанию и будет отображаться на http://localhost:8080

Тем не менее, есть один побочный эффект; Ваше приложение будет загружено дважды. Однажды для localhost:8080 и один раз для localhost:8080/yourApp, Чтобы это исправить, вы можете поместить свое приложение вне <catalina_home>/webapps и используйте относительный или абсолютный путь в теге docBase файла ROOT.xml. Что-то вроде этого;

<Context 
  docBase="/opt/mywebapps/<yourApp>" 
  path="" 
  reloadable="true" 
/>

И тогда все должно быть в порядке!

Вот следующие единственные решения, которые работали для меня. Добавьте это к узлу хоста в файле conf/server.xml

<Context path="" docBase="yourAppContextName">

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

перейдите в файл Tomcat server.xml и оставьте пустой путь

В Tomcat 9.0 мне нужно только изменить следующее в server.xml

<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

в

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

Не рекомендуется обновлять конфигурацию сервера, например server.xml или ROOT.xml.

Вы можете поместить файл конфигурации context.xml в каталог META-INF своего веб-приложения с включенным параметром пути к контексту. Это заменит настройку сервера по умолчанию?

то есть:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">

Этот маленький код работал для меня, используя виртуальные хосты

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>

<Context docBase="yourAppName" path="" reloadable="true">

перейдите в файл Tomcat server.xml и оставьте пустой путь

Самое быстрое и, возможно, лучшее решение - это иметь содержание ниже <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

И ваше веб-приложение будет доступно на http://<host>:<port>/

Для меня оба ответа сработали.

  1. Добавление файла с именем ROOT.xml в /conf/Catalina/localhost/
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. Добавление записи в server.xml
<Service name="Catalina2">
    <Connector port="8070" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8743" />
    <Engine name="Catalina2" defaultHost="localhost">
        <Host name="localhost"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/tmp/wars/hpong"  reloadable="true">
                <WatchedResource>WEB-INF/web.xml</WatchedResource>
            </Context>
      </Host>
    </Engine>
</Service>

Примечание: когда вы объявляете docBase в контексте, тогда игнорируйте appBase на хосте.

  1. Однако я предпочел преобразовать свое военное имя как ROOT.war и поместите его под webapps. Так что теперь непревзойденные URL-запросы из других войн (contextpaths) попадут в эту войну. Это лучший способ обработать путь контекста ROOT ("/**").

Второй вариант - это (двойная) загрузка войн из папки Webapps. Также ему нужна только несжатая военная папка, которая является головной болью.

Tomcat 8: после многих поисков это только рабочий код: в server.xml

<!-- Set /apple as default path -->
    <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
     <Context path="" docBase="apple">
         <!-- Default set of monitored resources -->
         <WatchedResource>WEB-INF/web.xml</WatchedResource>
     </Context>
    </Host>

Перезапустите Tomcat, убедитесь, что при доступе к 127.0.0.1:8080 он будет отображать содержимое в 127.0.0.1:8080/apple.

Мой проект был java веб-приложением, созданным netbeans, я установил контекстный путь в конфигурации проекта, ничего другого, даже я поместил apple.war в папку webapps.

Я сталкивался с этой проблемой в течение одного месяца. Размещение контекстного тега внутри server.xml небезопасно: оно влияет на элементы контекста, развертываемые для всех остальных хостов, для больших приложений это также приводит к ошибкам подключения, а также к плохой изоляции, например, вы можете получить доступ к другим сайтам по имени папки domain2.com/domain1Folder!! также соединения сеансов базы данных загружены дважды! Другой способ - поместить файл ROOT.xml, в котором есть тег контекста с полным путем, например:

 <Context path="" docBase="/var/lib/tomcat7/webapps/ROOT" />

в conf/catalina/webappsfoldername и разверните файл war как ROOT.war внутри webappsfoldername, а также укажите такой хост

 <Host name="domianname"  appBase="webapps2" unpackWARs="true"  autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false" >

        <Logger className="org.apache.catalina.logger.FileLogger"
               directory="logs"  prefix="localhost_log." suffix=".txt"
          timestamp="true"/>
</Host>

В этом подходе также для приложений одного типа пользовательские сессии не имеют хорошей изоляции! вы можете войти в app1, если app1 совпадает с app2, вы можете после входа в систему через сеанс на стороне сервера автоматически войти в app2?! Таким образом, вы должны хранить сессию пользователей в кэше на стороне клиента, а не с jsessionid! мы можем изменить имя движка с localhost для его решения. но скажем, чтобы играть с котом, нужно больше времени, чем играть с другими кошками!

Самое простое и гибкое решение приведено ниже: Inside ${Tomcat_home}/config/server.xml

Измените autoDeploy="false" deployOnStartup="false" в элементе Host, как показано ниже. Это необходимо.

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="false">

Добавьте строку ниже под элементом Host.

<Context path="" docBase="ServletInAction.war"  reloadable="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
        </Context>

С помощью описанного выше подхода мы можем добавить столько приложений под webapps с разными именами контекстных путей.

В Tomcat 8.X, в домашнюю директорию tomcat /conf/ folder в server.xml вы можете добавить <Context> тег под <Host> тег, как показано ниже. Но вы должны перезагрузить сервер, чтобы вступили в силу

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

     <Context docBase="${catalina.base}\webapps\<Your App Directory Name>" path="<your app path you wish>" reloadable="true" />
  </Host>

ИЛИ, если вы используете Tomcat 7.X, вы можете добавить файл context.xml в папку WEB-INF в вашем проекте. Содержимое файла, который я использовал, показан ниже. и это работало нормально для меня. вам не нужно перезагружать сервер в этом случае.

<?xml version="1.0" encoding="UTF-8"?>

<Context docBase="${catalina.base}\webapps\<My App Directory Name>" path="<your app path you wish>" reloadable="true" />

Когда дело доходит до запуска tomcat в контейнере (https://hub.docker.com/_/tomcat), наиболее удобным подходом является монтирование файла войны какROOT.warв/usr/local/tomcat/webapps/. Изменениеserver.xmlилиcontext.xmlгораздо сложнее.

Приведенный ниже трюк сработал для меня.

1) Прокомментируйте / удалите приведенную ниже конфигурацию из файла server.xml (внутри папки conf) tomcat.

2) Удалите существующую папку ROOT (если есть), находящуюся в папке tomcat webapps. И переименуйте файл войны (например, test.war) в ROOT.war.

Помните, что при переименовании файла war в ROOT.war "ROOT" должен быть заглавными.

Ограничение: Вы можете развернуть только одно приложение внутри одного экземпляра tomcat.

Другие вопросы по тегам