Як встановити контекстний шлях веб-програми в Tomcat 7.0


162

Я знаю, що я можу перейменувати свій web-файл (або файл WAR) на ROOT, але це жахливий спосіб зробити це, IMHO. Тепер я перевірив документ 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 не здається все таки необгрунтованим.
rimsky

Відповіді:


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. Щоб виправити це, ви можете розмістити свою програму OUTSIDE <catalina_home>/webappsта використовувати відносний або абсолютний шлях у тезі docBase ROOT.xml. Щось на зразок цього;

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

І тоді повинно бути все гаразд!


32
Вниз голосували? Гаразд, але чому? Якщо є краща альтернатива, повідомте мене теж! : D
Paaske

1
Чи буде це працювати з іншими війнами у звичайній папці webapps?
chrislovecnm

5
Щоб вирішити подвійне розгортання, ви також можете встановити як "implemenOnStartup", так і "autoDeploy" false атрибут Host на сервері.xml
1313

8
Я виявив, що якщо ви не перейменовуєте папку ROOT за замовчуванням у / webapps, "кішка повертається", і вона скидає docBase в ROOT.xml. Це з сервером розробки vfabric tc VMWare ... Будьте попереджені.
хосердуд

3
Схоже, Tomcat 7 зараз не дозволить docBase всередині / webapps, тому, здається, обов'язковий пошук файлу війни в іншому місці.
Mojo

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 Однак використання сервера.xml для визначення контексту не рекомендується
Ізмаїл Явуз

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? На думку, наприклад, Ali.Mojtehedy вище, це проблематично. Крім того, в інших відповідях зазначено, що /path/toпотрібно знаходитись поза звичайним веб-пунктом шляху.
Жан Йордаан

Здається, добре працює. Звичайно, ви не хочете, щоб програма ROOT існувала в тій самій папці webapps, щоб вона конфліктувала з вашою.
Ентоні Хейвард

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: // <host>: <port> /, я все ще бачу домашню сторінку Tomcat замість програми Foobar. Я навіть перезапустив Tomcat. Що я роблю неправильно?
кімбауді

Коли я роблю шлях недійсним, він не доходить до мого додатка):
Snickers3192,

1

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

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

у conf / catalina / webappsfoldername та розгорнути файл війни як 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, щоб вирішити його. але, скажімо, грати з Tomcat потрібно більше часу, ніж грати з іншими котами!


1

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

Ви можете помістити файл конфігурації контексту.xml у свій каталог META-INF веб-додатків із включеним налаштуванням контуру шляху. Це змінить налаштування сервера за замовчуванням?

тобто:

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

1

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

перейдіть у файл Tomcat server.xml і встановіть шлях пустим


1

Tomcat 8: Після багатьох пошукових запитів це лише робочий код: in 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і розмістити його під веб-сайтами. Тож тепер неперевершені запити URL-адрес інших воєн (контекстних шляхів) будуть переходити у цю війну. Це кращий спосіб обробити контекстний шлях ROOT ("/ **").

Другий варіант - це подвійне завантаження війн з папки Webapps. Крім того, їй потрібна лише нестиснута папка війни, яка болить головою.




1

У Tomcat 8.X, під домашнім каталогом / conf / папкою tomcat на сервері.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 докер, і він працює як 8.0 ви згадали. localhost:8080/<Your App Directory Name>/і localhost:8080/<your app path you wish>/обидві ці 2 URL-адреси працюють одночасно. Знайдено ці дві витягнуті папки під $CATALINA_HOME/webapps/.
niaomingjian

1

Найпростіше і гнучко рішення нижче: Всередині $ {Tomcat_home} /config/server.xml

Змініть autoDeploy = "false" implemenOnStartup = "false" під елементом Host, як показано нижче Це обов'язково.

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

Додайте рядок під елементом Хост .

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

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


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

-6

Наведений нижче трюк спрацював для мене.

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

2) Видаліть існуючу папку ROOT (якщо така є), що знаходиться у папці webcup temcat. І перейменуйте свій воєнний (наприклад: test.war) файл на ROOT.war.

Пам'ятайте, що під час перейменування файлу війни на ROOT.war "ROOT" повинен міститись у великих ковпаках.

Обмеження: Ви можете розгорнути лише одну програму всередині одного екземпляра tomcat.


3
З питання: "Я знаю, що я можу перейменувати свій web-файл (або файл WAR) у ROOT, але це жахливий спосіб зробити це, IMHO."
Жан Йордаан

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