Контекстный путь Tomcat 8.5 работает неправильно

У меня есть приложение с именем cat_tiger.war, которое развертывается как localhost:8080/cat_tiger, но вместо этого я хочу изменить контекстный путь на localhost:8080/cat/lion/. Я добавил файл META-INF/context.xml как

<?xml version="1.0" encoding="UTF-8"?> <Context copyXML="true" docBase="cat_tiger" path="/cat/lion"/>

и файл server.xml должен быть

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

но он по-прежнему развертывается как localhost:8080/cat_tiger/

Есть идеи, что еще нужно изменить?

РЕДАКТИРОВАТЬ: [1] Tomcat 8.5.3

[2] 04-Sep-2018 13:50:41.830 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of configuration descriptor [/opt/tomcat/conf/Catalina/localhost/cat_tiger.xml] has finished in [2,750] ms ... ... 04-Sep-2018 13:50:39.070 WARNING [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDescriptor A docBase [/opt/tomcat/webapps/cat_tiger] inside the host appBase has been specified, and will be ignored

[3] Я выполняю развертывание через Netbeans, но в конечном итоге мне придется развертывать его в контейнере Docker.


person GrizzLee    schedule 04.09.2018    source источник
comment
Это работает для меня. Не могли бы вы обновить свой пост (вместо комментариев) следующей информацией: [1] Версия Tomcat, которую вы используете. [2] Опубликуйте то, что вы видите в журнале Catalina Tomcat при развертывании. Я вижу это: Развертывание дескриптора конфигурации [C:\apache-tomcat-8.5.20\conf\Catalina\localhost\cat#lion.xml] Вы видите что-то подобное? [3] Дайте полную информацию о том, как вы развертываете свое приложение на Tomcat: вручную или через IDE, останавливаете ли вы Tomcat, какие файлы копируются и т. д.   -  person skomisa    schedule 04.09.2018
comment
Я только что заметил, что версия Tomcat указана в вашем заголовке. Можете ли вы добавить тег tomcat8.5?   -  person skomisa    schedule 04.09.2018


Ответы (1)


Я не понимаю, почему у вас возникли проблемы, но я создал веб-проект с помощью NetBeans 8.2 (Файл > Новый проект... > Java Web > Веб-приложение) и успешно изменил контекст , так что, возможно, если я расскажу подробности своего проекта, вы сможете определить, в чем принципиальная разница.

1 cat_tiger\web\META- INF\context.xml

Мой файл выглядит так же, как ваш:

<?xml version="1.0" encoding="UTF-8"?>
<Context copyXML="true" docBase="cat_tiger" path="/cat/lion"/>

[2] Запуск вывода

Выберите узел проекта, щелкните правой кнопкой мыши и выберите Выполнить во всплывающем меню для запуска на Tomcat 8.5:

ant -f D:\\NB82\\cat_tiger -Dnb.internal.action.name=run -Ddirectory.deployment.supported=true -DforceRedeploy=false -Dnb.wait.for.caches=true -Dbrowser.context=D:\\NB82\\cat_tiger -Duser.properties.file=C:\\Users\\johndoe\\AppData\\Roaming\\NetBeans\\8.2\\build.properties run
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-jsps:
In-place deployment at D:\NB82\cat_tiger\build\web
Deployment is in progress...
deploy?config=file%3A%2FC%3A%2FUsers%2Fjohndoe%2FAppData%2FLocal%2FTemp%2Fcontext7953615149857268018.xml&path=/cat/lion
OK - Deployed application at context path [/cat/lion]
Start is in progress...
start?path=/cat/lion
OK - Started application at context path [/cat/lion]
run-deploy:
Browsing: http://localhost:8080/cat/lion
run-display-browser:
run:
BUILD SUCCESSFUL (total time: 0 seconds)

На самом деле вам, вероятно, не нужно запускать приложение, чтобы увидеть проблему; просто выберите Развернуть вместо Выполнить во всплывающем меню. Это вывод, который я получаю от Deploy:

ant -f D:\\NB82\\cat_tiger -Dnb.internal.action.name=redeploy -Ddirectory.deployment.supported=true -DforceRedeploy=true -Dnb.wait.for.caches=true -Dbrowser.context=D:\\NB82\\cat_tiger -Duser.properties.file=C:\\Users\\johndoe\\AppData\\Roaming\\NetBeans\\8.2\\build.properties run-deploy
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-jsps:
Undeploying ...
undeploy?path=/cat_tiger
OK - Undeployed application at context path [/cat_tiger]
In-place deployment at D:\NB82\cat_tiger\build\web
Deployment is in progress...
deploy?config=file%3A%2FC%3A%2FUsers%2Fjohndoe%2FAppData%2FLocal%2FTemp%2Fcontext5063723197082921373.xml&path=/cat/lion
OK - Deployed application at context path [/cat/lion]
Start is in progress...
start?path=/cat/lion
OK - Started application at context path [/cat/lion]
run-deploy:
BUILD SUCCESSFUL (total time: 0 seconds)

[3] Журнал Tomcat

Вот подробности развертывания в журнале Tomcat, где вы можете видеть, что мое развертывание правильно отображает контекст, а ваше — нет:

05-Sep-2018 23:09:09.321 INFO [http-nio-8080-exec-6] org.apache.catalina.startup.HostConfig.deployDescriptor Deploying configuration descriptor [C:\apache-tomcat-8.5.20\conf\Catalina\localhost\cat#lion.xml]
05-Sep-2018 23:09:09.334 INFO [http-nio-8080-exec-6] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of configuration descriptor [C:\apache-tomcat-8.5.20\conf\Catalina\localhost\cat#lion.xml] has finished in [13] ms
05-Sep-2018 23:09:09.338 INFO [http-nio-8080-exec-5] org.apache.catalina.util.LifecycleBase.start The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cat/lion]] after start() had already been called. The second call will be ignored.

[4] C:\apache-tomcat-8.5.20\conf\Catalina\localhost\cat#lion.xml

Это файл, созданный Tomcat при развертывании приложения:

<?xml version="1.0" encoding="UTF-8"?>
<Context copyXML="true" docBase="D:\NB82\cat_tiger\build\web" path="/cat/lion"/>

Обратите внимание, что docBase содержит абсолютный путь.

[5] server.xml

Вот весь контент. Я использую Томкат 8.5. Обратите внимание, что элемент <host> немного отличается от вашего, но когда я добавил copyXML="true" deployXML="true" к элементу <host> (чтобы он был похож на ваш) все продолжало нормально работать:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
    <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
    <GlobalNamingResources>
        <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
    </GlobalNamingResources>
    <Service name="Catalina">
        <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars="[]|{}^+\`&quot;&lt;&gt;"/>
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
        <Engine defaultHost="localhost" name="Catalina">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
            </Realm>
            <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
                <Context docBase="C:\apache-tomcat-8.5.20\wtpwebapps\PlusServlet" path="/PlusServlet" reloadable="true" source="org.eclipse.jst.jee.server:PlusServlet"/>
            </Host>
        </Engine>
    </Service>
</Server>

Обновлено 06.09.2018:

Не обращайте внимания на ответ, данный выше! Несмотря на то, что это сработало для моей конфигурации, этот подход явно запрещен в документации Tomcat.

В частности, path не следует указывать в <Context> файла context.xml, размещенного в каталоге META-INF приложения. Из описания path в Common Раздел атрибутов документации Tomcat 8.5 для контейнера контекста:

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

Даже при статическом определении контекста в файле server.xml этот атрибут не должен устанавливаться, за исключением случаев, когда либо docBase не находится в appBase хоста, либо оба параметра deployOnStartup и autoDeploy не имеют значения false. Несоблюдение этого правила может привести к двойному развертыванию.

person skomisa    schedule 06.09.2018
comment
Спасибо за подробный ответ, к сожалению, я все еще не могу заставить его работать с файлом приложения context.xml. На данный момент я прибегнул к ручному добавлению элемента Context в server.xml. :D - person GrizzLee; 06.09.2018
comment
@GrizzLee Хорошо, я в тупике, почему у тебя это не работает. Но вы знаете, что обновление server.xml напрямую не рекомендуется, верно? Это нормально, чтобы начать и работать, но все же стоит заставить это работать в NetBeans, и это определенно работает для меня. Еще одно простое изменение, которое вы можете попробовать, — указать абсолютный путь в docBase в вашем context.xml. - person skomisa; 06.09.2018
comment
@GrizzLee Я только что прочитал соответствующую документацию по Tomcat 8.5 и Я обновил свой ответ соответственно. То, что мы пытались сделать, было недопустимым (хотя у меня это сработало), и размещение <Context> в server.xml подходит для того, что вы делаете. - person skomisa; 07.09.2018
comment
извините за поздний ответ, да, это то, что я в конечном итоге сделал. Его сбивает с толку то, что в документе говорится, что у него есть возможность иметь context.xml в каждом приложении, но позже говорится, что мы можем изменить только путь в server.xml... Однако спасибо за помощь! - person GrizzLee; 19.09.2018