Как установить контекстный путь веб-приложения в 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>/
Для меня оба ответа сработали.
- Добавление файла с именем ROOT.xml в /conf/Catalina/localhost/
<Context docBase="/tmp/wars/hpong" path="" reloadable="true" />
- Добавление записи в 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 на хосте.
- Однако я предпочел преобразовать свое военное имя как
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.