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

174

我知道可以将我的Web应用程序(或其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>"来加载。

任何指针都有帮助。


2
文档中给出的“不建议直接将元素放置在server.xml文件中”的原因在下一句话中解释:“这是因为它使得修改上下文配置更加复杂,因为无法重新加载主conf/server.xml文件而不重启Tomcat。”下面的接受答案直接解决了这个问题,但如果您不太可能再次修改此路径或重新启动并不会过于繁琐,那么修改server.xml似乎并不那么不合理。 - rimsky
14个回答

247
你可以执行以下操作:
<catalina_home>/conf/Catalina/localhost/目录下添加名为ROOT.xml的文件。
这个ROOT.xml将覆盖该引擎和主机(Catalina和localhost)中Tomcat安装的根上下文的默认设置。
将以下内容输入到ROOT.xml文件中:
<Context 
  docBase="<yourApp>" 
  path="" 
  reloadable="true" 
/>

在这里,<yourApp>是您的应用程序的名称。

好了,现在您的应用程序已经成为默认应用程序,并会显示在 http://localhost:8080 上。

但是,有一个副作用:您的应用程序将被加载两次。一次为 localhost:8080,另一次为 localhost:8080/yourApp。要解决此问题,您可以将应用程序放在 <catalina_home>/webapps 之外,并在 ROOT.xml 的 docBase 标签中使用相对或绝对路径。像这样:

<Context 
  docBase="/opt/mywebapps/<yourApp>" 
  path="" 
  reloadable="true" 
/>

然后一切都应该没问题了!


6
为解决双重部署问题,您可以在server.xml文件中将Host属性的“deployOnStartup”和“autoDeploy”都设置为false。 - Sefler
8
我发现,如果不重命名 /webapps 下的默认 ROOT 文件夹,“猫”就会回来并重置 ROOT.xml 中的 docBase。这是在 VMWare 的 vfabric tc 开发服务器上发生的...请注意。 - hoserdude
4
现在看起来Tomcat 7不再允许在/webapps目录下设置docBase,因此必须将war文件放在其他地方。 - Mojo
1
如果我想使用WAR文件而不是解压缩的文件怎么办?显然Tomcat拒绝了这样做。有什么想法吗? - Bogdan Zurac
显示剩余18条评论

15

这是唯一一个对我有效的解决方案。在conf/server.xml文件的Host节点中添加以下内容。

<Context path="" docBase="yourAppContextName">
 
  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

更新:
它可以在 conf/server.xml 或者在 conf/context.xml 中。


1
会在 server.xmlcontext.xml 文件中吗?我在我的 context.xml 文件中看到了一个 XML 标签 <Context> - Saif
9
在server.xml中也有一个<context>标签,但强烈不建议使用server.xml来定义上下文。 - Ismail Yavuz

6
在Tomcat 9.0中,我只需要在server.xml文件中更改以下内容。
<Context docBase="web" path="/web" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

to

<Context docBase="web" path="" reloadable="true" source="org.eclipse.jst.jee.server:web"/>

它可以工作,但如果设置autoDeploy="true",会导致双重部署。这已经在被接受的答案中得到解决。其次,在server.xml中直接添加Context部分并不是推荐的方法。https://tomcat.apache.org/tomcat-9.0-doc/config/context.html#Defining%20a%20context - thinwa

3

这段小代码对我很有用,使用虚拟主机

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>

这是在 server.xml 中吗?根据上面的 Ali.Mojtehedy 的说法,那是有问题的。此外,其他答案指出 /path/to 需要放在正常的 webapps 路径之外。 - Jean Jordaan
看起来运行良好。当然,您不希望 ROOT 应用程序存在于相同的 webapps 文件夹中以与您的应用程序发生冲突。 - Anthony Hayward

2

<Context docBase="你的应用名" path="" reloadable="true">

进入Tomcat server.xml文件并将路径设置为空


需要关闭标签:<Context docBase="yourAppName" path="" reloadable="true" /> - Eric

2
最快且可能是最好的解决方案是将以下内容放置在 <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml 中。
<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

您的 Web 应用程序将可以通过 http://<主机>:<端口号>/ 访问


1
该docBase目录是绝对路径还是相对于特定文件夹的呢? - Jose Martinez
3
我尝试过了,但它没有起作用。我有一个名为 Foobar 的应用程序位于 /opt/tomcat/webapps/Foobar 中。我尝试将 docBase 设置为 Foobar/opt/tomcat/webapps/Foobar,但当我访问 http://<host>:<port>/ 时,我仍然看到 Tomcat 主页而不是我的 Foobar 应用程序。我甚至重新启动了 Tomcat。我做错了什么? - kimbaudi
当我将路径设置为null时,它无法到达我的应用程序): - Derrops

2

不建议更新服务器配置文件,例如 server.xml 或 ROOT.xml。

您可以在 web 应用程序的 META-INF 目录下放置一个 context.xml 配置文件,并包含上下文路径设置。这将覆盖默认的服务器设置?

例如:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">

这在Tomcat 9中不起作用! - xtermi2

2

对我来说,两个答案都起作用。

  1. 在 /conf/Catalina/localhost/ 中添加名为 ROOT.xml 的文件
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
  1. 在 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时,请忽略Host下的appBase。
但是我更喜欢将我的war名称转换为ROOT.war并将其放置在webapps下。因此,来自其他war(contextpaths)的不匹配的url请求现在将落入此war中。这是处理ROOT(“/ **”)上下文路径的更好方式。
第二个选项是从Webapps文件夹中(双重)加载wars。它还只需要未压缩的war文件夹,这是一个麻烦。

https://coderanch.com/t/494034/application-servers/remove-war-urls-tomcat - Kanagavelu Sugumar
https://dev59.com/e1oV5IYBdhLWcg3wLsP5 - Kanagavelu Sugumar

1
在Tomcat 8.X中,在服务器.xml文件下的Tomcat主目录/conf/文件夹中,您可以添加<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,您可以在项目的WEB-INF文件夹中添加context.xml文件。我使用的文件内容如下,对我而言运行良好。在这种情况下,您无需重新启动服务器。

<?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:9.0 docker中测试,与您提到的8.0版本一样可以正常工作。localhost:8080/<您的应用程序目录名称>/localhost:8080/<您希望的应用程序路径>/这两个URL同时可用。这两个提取的文件夹都在$CATALINA_HOME/webapps/下。 - niaomingjian

1
我遇到了这个问题一个月了,将context标签放在server.xml文件中不安全,它会影响所有其他主机的context元素部署。对于大型应用程序,这会导致连接错误,并且隔离效果不好。例如,您可能通过文件夹名domain2.com/domain1Folder访问其他站点!此外,数据库会话连接会加载两次!另一种方法是将带有完整路径的context标签的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解决它。 但是,假设与tomcat玩耍需要更多时间,而与其他猫玩耍需要更少的时间!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接