问题

如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?


我在此处的 Tomcat 指南和一些 SO 问题上阅读了有关此内容的信息。而且我认为我几乎在做同样的事情。但在某种程度上无法成功。

首先,我必须说我的应用程序部署在我无法控制的共享 Tomcat 服务器上。我只是删除了我的 .war 文件,然后它就被部署了。

我试图将我的应用程序打包为 ROOT.war 但没有用。管理员告诉我将它打包为我想要的任何名称,他们会处理它。我将它打包为 my-application.war 并且它已部署但我必须输入 http://my-host/my-application 访问网站。

在联系管理员后,他们告诉我他们已经在我的主机中的 Tomcat 配置文件中放置了一个上下文元素,例如:

<Context path="" docBase="path of my-application deployed folder"/>

这应该将 my-application 设置为所有到达 my-host 的请求的默认应用程序。但它没有,每当我输入 http://my-host 我得到:

HTTP Status 404 - / The requested resource (/) is not available

但是当我再次输入 http://my-host/my-application 时,一切正常。任何关于可能出错的建议都绝对值得赞赏。

更新:我尝试按照 tomcat 文档中描述的有关如何使应用程序默认的步骤进行操作。描述了 3 种方法,我尝试了所有三种方法,并且可以成功地将我的应用程序部署为 localhost 上的 ROOT。

我还尝试重现我在远程服务器上面临的问题,以便找到原因并将其报告给管理员。我发现了几个问题。

  1. 在管理员发送给我的 server.xml 片段中,autoDeploy 和 deployOnStartUp 设置为 true,而如果在 server.xml 中明确定义 Context 元素,它们应该为 false。这将导致双重部署,即创建一个 ROOT 文件夹和一个名为 .war 文件的文件夹。删除 .war 将删除它的相应文件夹并取消部署应用程序,但 ROOT 仍然存在,必须手动删除,并且需要重新启动 Tomcat。在重新启动之前,ROOT.war 的任何部署都会失败。
  2. 我认为有一些原因会阻止 ROOT.war 部署。一种可能是 conf/{engine-name}/{host-name} 中存在 ROOT.xml 或主机的 appBase 中存在 ROOT 文件夹,或者如上所述,来自先前部署的 ROOT 应用程序未取消部署,需要 Tomcat 重新启动。

无论哪种方式,我都无法准确指出阻止 ROOT.war 部署的原因,因为这需要访问 Tomcat 日志文件和 conf 文件来检查我上面描述的情况。

同样从我看到的所有内容来看,我的管理员似乎无法维护 Tomcat 服务器并发现问题。因此,在与共享服务器苦苦挣扎后,我决定使用专用的 Tomcat 服务器。

推荐答案

在您的问题中,您声明管理员将上下文设置为:

<Context path="" docBase="path of my-application deployed folder"/>

根据上面的评论,我建议尝试使用应用程序的相对路径而不是绝对路径。

我在我的 tomcat 服务器上试过这个:

<Context path="/" docBase="my-application/" />

这就是诀窍。

包含 Context 元素的 Host 元素确实设置了一些可能也会影响上下文的参数。如果它是默认设置,那么相对上下文应该只是指向 webapps 文件夹。如果已更改,结果可能会有所不同。