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


162

Я знаю, что могу переименовать свое веб-приложение (или его 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>"

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



1
Причина «НЕ рекомендуется размещать элементы непосредственно в файле server.xml», приведенная в документации, следует из следующего предложения: «Это потому, что это делает изменение конфигурации контекста более инвазивным, поскольку основной файл conf / server.xml не может быть перезагружен без перезапуска Tomcat. " Принятый ответ ниже напрямую решает проблему, но если вы вряд ли измените этот путь снова, или перезапуски не слишком разрушительны, изменение server.xml не кажется таким уж необоснованным.
римский

Ответы:


236

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

Добавить файл с именем 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" 
/>

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


32
Вниз проголосовали? Хорошо, но почему? Если есть лучшая альтернатива, дайте мне знать тоже! : D
Пааске

1
Будет ли это работать с другими войнами в обычной папке веб-приложений?
chrislovecnm

5
Чтобы решить проблему двойного развертывания, вы также можете установить оба атрибута "deployOnStartup" и "autoDeploy" false атрибута Host в
файле

8
Я обнаружил, что если вы не переименуете папку ROOT по умолчанию в / webapps, «кошка возвращается», и она сбрасывает docBase в ROOT.xml. Это с сервером разработки VMware vfabric tc ... Будьте осторожны.
hoserdude

3
Похоже, что Tomcat 7 не разрешит docBase внутри / webapps сейчас, поэтому было бы обязательным размещать файл war в другом месте.
Моджо

12

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

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

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

</Context>

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


1
будет на server.xmlили context.xml? я вижу тег XML <Context>в моемcontext.xml
Saif

6
Существует также тег xml контекста в файле server.xml. Однако использование server.xml для определения контекста не рекомендуется
Ismail Yavuz

4

В 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"/>

3

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

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

Это в server.xml? По словам например Али.Мойтехиды выше, это проблематично. Кроме того, другие ответы утверждают, что они /path/toдолжны находиться за пределами обычного пути веб-приложений.
Жан Джордаан

Кажется, работает нормально. Конечно, вы не хотите, чтобы приложение ROOT, существующее в той же папке веб-приложений, конфликтовало с вашим.
Энтони Хейворд

2

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

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

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


1
Это каталог docBase абсолютный или относительный к определенной папке?
Хосе Мартинес

3
Я попробовал это, но это не работает. У меня есть приложение , которое называется Foobarв /opt/tomcat/webapps/Foobar. Я попытался установить docBase Foobarи также /opt/tomcat/webapps/Foobar, но когда я захожу на `http: // <хост>: <порт> /, я все еще вижу домашнюю страницу Tomcat вместо моего приложения Foobar. Я даже перезапустил Tomcat. Что я делаю не так?
Кимбауди

Когда я делаю путь нулевым, он не достигает моего приложения):
Snickers3192

1

Я сталкивался с этой проблемой в течение одного месяца. Размещение контекстного тега внутри 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, чтобы решить его. но скажем, чтобы играть с котом, нужно больше времени, чем играть с другими кошками!


1

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

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

то есть:

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

1

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

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


1

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.


1

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

  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. Также ему нужна только несжатая военная папка, которая является головной болью.




1

В 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: 9.0 docker, и оно работает как 8.0, как вы упомянули. localhost:8080/<Your App Directory Name>/и localhost:8080/<your app path you wish>/оба эти 2 URL работают одновременно. Нашел эти две извлеченные папки под $CATALINA_HOME/webapps/.
niaomingjian

1

Самое простое и гибкое решение приведено ниже: 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>

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


Альтернативное решение без конфигурации выше doinf - просто переименуйте ваш war-файл в root.war и поместите его в каталог webapps. Автоматически контекстный путь будет установлен в /.
Рави Гупта

-6

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

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

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

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

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


3
Из вопроса: «Я знаю, что могу переименовать свое веб-приложение (или его WAR-файл) в ROOT, но это ужасный способ сделать это, ИМХО».
Жан Джордаан

1
Я не хотел бы ограничиваться использованием только одного веб-приложения на экземпляр tomcat.
Ульрих
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.