Tomcat 8.5 上下文路径无法正常工作

Tomcat 8.5 context path not working correctly

我有一个名为 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]Tomcat8.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 容器中。

我不明白您为什么遇到问题,但我已经使用 NetBeans 8.2 创建了 Web 项目(文件 > 新建项目... > Java Web > 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] 运行 输出

Select 项目节点,右击 select 运行 从弹出菜单到 运行 on 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)

实际上,您可能不需要 运行 应用程序来查看问题;只是 select Deploy 而不是弹出菜单中的 运行。这是我从 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

这里是全部内容。我正在使用 Tomcat 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>

2018 年 9 月 6 日更新:

忽略上面给出的答案!尽管它碰巧适用于我的配置,但该方法在 Tomcat 文档中被明确禁止。

具体而言,不应在 context.xml 文件的 <Context> 中指定 path应用程序的 META-INF 目录。来自上下文容器的 Common Attributes section of the Tomcat 8.5 documentation 中的 path 描述:

This attribute must only be used when statically defining a Context in server.xml. In all other circumstances, the path will be inferred from the filenames used for either the .xml context file or the docBase.

Even when statically defining a Context in server.xml, this attribute must not be set unless either the docBase is not located under the Host's appBase or both deployOnStartup and autoDeploy are false. If this rule is not followed, double deployment is likely to result.