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


162

我知道我可以将我的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>"

任何指针都有帮助。



1
文档中给出的“不建议将元素直接放置在server.xml文件中”的原因在下一句中说明:“这是因为主conf / server.xml文件无法修改上下文配置,因此更具侵入性重新加载,而无需重新启动Tomcat。” 下面接受的答案可以直接解决问题,但是,如果您不太可能再次修改此路径,或者重新启动不会造成太大破坏,则修改server.xml似乎并不那么不合理。
rimsky '16

Answers:


236

您可以执行以下操作;

添加一个名为ROOT.xml<catalina_home>/conf/Catalina/localhost/

该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" 
/>

然后应该一切正常!


32
不赞成投票?好吧,为什么呢?如果有更好的选择,请告诉我!:D
Paaske 2012年

1
这可以与常规webapps文件夹中的其他战争一起使用吗?
chrislovecnm 2012年

5
要解决双重部署问题,您还可以在server.xml
中将

8
我发现,如果不重命名/ webapps下的默认ROOT文件夹,“猫就会回来”,它将在ROOT.xml中重置docBase。这是与VMWare的vfabric tc开发服务器一起使用的。
hoserdude

3
看来Tomcat 7现在不允许在/ webapps中使用docBase,因此将war文件放在其他位置似乎是强制性的。
Mojo 2014年

12

以下是对我有用的唯一解决方案。将其添加到conf / server.xml中的Host节点

<Context path="" docBase="yourAppContextName">

  <!-- Default set of monitored resources -->
  <WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

转到Tomcat server.xml文件并将路径设置为空


1
将在server.xmlcontext.xml?我<Context>context.xml
Saif 2014年

6
还有在server.xml中的上下文XML标记然而上下文的server.xml使用定义气馁
伊斯梅尔Yavuz的

4

在Tomcat 9.0中,我只需要在 server.xml

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

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

3

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

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

这是在server.xml?根据上面的Ali.Mojtehedy的说法,这是有问题的。此外,其他的答案状态/path/to需要被外界正常的webapps路径。
让·乔丹

似乎工作正常。当然,您不希望ROOT应用程序存在于同一个webapps文件夹中而与您的文件夹冲突。
安东尼·海沃德

2

最快且可能最好的解决方案是将以下内容包含在 <TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

您的Web应用将在以下位置可用 http://<host>:<port>/


1
该docBase目录是绝对目录还是相对于特定文件夹?
何塞·马丁内斯

3
我试过了,但是没有用。我有一个名为应用程序Foobar/opt/tomcat/webapps/Foobar。我尝试将docBase设置为Foobar和并且/opt/tomcat/webapps/Foobar,但是当我访问`http:// <host>:<port> /时,我仍然看到Tomcat主页而不是Foobar应用程序。我什至重启了Tomcat。我究竟做错了什么?
kimbaudi

当我将路径设为空时,它不会到达我的应用程序):
Snickers3192

1

我面临这个问题一个月,在server.xml中放置上下文标记并不安全,这会影响为所有其他主机部署的上下文元素,对于大型应用程序,连接错误也没有很好的隔离,例如,您可以通过文件夹名称domain2访问其他站点.com / domain1文件夹!还将数据库会话连接加载两次!另一种方法是将ROOT.xml文件放入具有上下文标记的完整路径,例如:

 <Context path="" docBase="/var/lib/tomcat7/webapps/ROOT" />

在conf / catalina / webappsfoldername中并将war文件部署为webappsfoldername中的ROOT.war并指定主机,例如

 <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一起玩比和其他猫一起玩需要更多的时间!


1

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

您可以将context.xml配置文件放在Web应用程序META-INF目录下,其中包括上下文路径设置。这将覆盖默认服务器设置吗?

即:

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


1

Tomcat 8:经过多次搜索,这只是工作代码:server.xml中

<!-- Set /apple as default path -->
    <Host name="localhost"  appBase="webapps"
         unpackWARs="true" autoDeploy="true">
     <Context path="" docBase="apple">
         <!-- Default set of monitored resources -->
         <WatchedResource>WEB-INF/web.xml</WatchedResource>
     </Context>
    </Host>

重新启动Tomcat,确保当您访问127.0.0.1:8080时,它将显示127.0.0.1:8080/apple中的内容

我的项目是由netbeans创建的Java Web应用程序,我在项目配置中设置了上下文路径,没有别的事情,甚至我将apple.war放在了webapps文件夹中。


1

对我来说,两个答案都有效。

  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时,请忽略主机上的appBase。

  1. 但是,我更喜欢将战争名称转换为ROOT.warwebapps。因此,现在其他战争(contextpaths)无法匹配的url请求将进入这场战争。这是处理ROOT(“ / **”)上下文路径的更好方法。

第二个选项是(两次)也从Webapps文件夹加载wars。而且它只需要未压缩的war文件夹,这是一件令人头疼的事情。




1

在Tomcat 8.X中,可以在server.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/<Your App Directory Name>/并且localhost:8080/<your app path you wish>/这两个网址都可以同时使用。在下找到这两个提取的文件夹$CATALINA_HOME/webapps/
niaomingjian

1

下面是最简单,最灵活的解决方案:在$ {Tomcat_home} /config/server.xml中

更改主机元素下的autoDeploy =“ false” deployOnStartup =“ false”,如下所示。这是必须的。

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="false" deployOnStartup="false">

主机元素下添加以下行。

<Context path="" docBase="ServletInAction.war"  reloadable="true">
            <WatchedResource>WEB-INF/web.xml</WatchedResource>
        </Context>

通过上述方法,我们可以在具有不同上下文路径名的webapps下添加尽可能多的应用程序。


没有上面配置的doinf的替代解决方案是将war文件重命名为root.war并将其放在webapps目录下。自动将上下文路径设置为/。
拉维·古普塔

-6

下面的技巧对我有用。

1)从tomcat的server.xml文件(位于conf文件夹中)注释/删除以下配置。

2)删除位于tomcat webapps文件夹内的现有ROOT文件夹(如果有)。并将您的war(例如test.war)文件重命名为ROOT.war。

请记住,将战争文件重命名为ROOT.war时,“ ROOT”应为大写。

限制:您只能在一个tomcat实例中部署一个应用程序。


3
从一个问题开始:“我知道我可以将我的Web应用程序(或它的WAR文件)重命名为ROOT,但这是一种糟糕的方法,恕我直言。”
让·乔丹

1
我不想将自己限制为每个tomcat实例仅使用一个webapp。
ulrich
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.