外部tomcat中的自定义上下文路径

Posted

技术标签:

【中文标题】外部tomcat中的自定义上下文路径【英文标题】:Custom context path in external tomcat 【发布时间】:2017-02-16 12:43:07 【问题描述】:

我制作了一个想在外部 tomcat 8 中运行的 Spring-Boot 应用程序。

在 Spring-Boot 应用程序中,可以使用 application.properties 中的属性 server.context-path 选择上下文路径,但由于我使用的是外部 tomcat 8,因此不使用此属性。

因此,我查看了tomcat-8 documentation,其中指出:

如果要使用与基本文件名无关的上下文路径部署 WAR 文件或目录,则必须使用以下选项之一来防止重复部署:

禁用 autoDeploy 和 deployOnStartup 并在 server.xml 中定义所有上下文 在主机的 appBase 之外找到 WAR 和/或目录,并使用带有 docBase 属性的 context.xml 文件来定义它。

因为我不想污染server.xml,所以我选择了第二个选项。因此,我将战争定位在/home/myuser/myapp/application-1.0.0.war 中,并在conf/Catalina/localhost 下放置了一个上下文文件名application-1.0.0.xml。该文件仅包含这两行:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myapp" docBase="/home/myuser/myapp"/>

我可以在日志中看到 tomcat8 启动成功,应用程序似乎部署在 tomcat 管理器中但是:

路径是/application-1.0.0,而不是/myapp。 此外,application-1.0.0 目录出现在work 目录中,但保持为空。 日志不显示任何与 spring 相关的日志,就好像应用程序从未初始化过一样。

注意:我知道战争是正确的,因为如果我将它放在 webapp 目录中(尽管使用默认上下文路径),它就会起作用。

注意:如果我将application-1.0.0.xml 重命名为foo.xml,tomcat 管理器会显示应用程序部署在上下文路径/foo 下(但它仍然从未启动)。

有什么想法吗?

【问题讨论】:

【参考方案1】:

找到答案:

关于上下文路径,上下文文件的path属性确实被忽略了:

该属性只能在 server.xml 中静态定义上下文时使用。在所有其他情况下,将根据用于 .xml 上下文文件或 docBase 的文件名推断路径。

关于docBase 属性,我误解了以下句子

在主机的 appBase 之外找到 WAR 和/或目录,并使用带有 docBase 属性的 context.xml 文件来定义它。

实际上,在docBase 中,我放置了包含战争的目录的路径,而不是战争本身的路径。

【讨论】:

那么正确的配置是什么?并且 - 每次部署新版本时都需要更新文件吗? 我也需要答案。你能发布整个解决方案吗?【参考方案2】:

如果它对某人有帮助,以下(放在 conf\Catalina\localhost\service-discovery.xml 中)在 Tomcat 9 上对我有用

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/service-discovery" docBase="D:/Projects/codebase/apps/service-discovery/target/service-discovery.war"/>

【讨论】:

以上是关于外部tomcat中的自定义上下文路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wildfly 中定义上下文路径?

从flex3中的自定义按钮调用放大和缩小上下文菜单

如何在 Tomcat 7.0 中设置 Web 应用程序的上下文路径

Qt5 和 Qt Quick 2 中的自定义实时绘图

WebSphere 中的上下文根文件夹位置

Spring Boot:注入自定义上下文路径