【问题标题】:How to set the context path of a web application in Tomcat 7.0如何在 Tomcat 7.0 中设置 Web 应用程序的上下文路径
【发布时间】:2011-11-08 18:30:52
【问题描述】:

我知道我可以将我的 webapp(或它的 WAR 文件)重命名为 ROOT,但恕我直言,这是一种糟糕的方式。现在我查看了 tomcat 文档,上面写着

不建议将元素直接放在 server.xml 文件

所以我尝试使用它建议的另一种方法。

可以明确定义各个上下文元素:在 应用程序文件中 /META-INF/context.xml 中的单个文件。

所以我用下面的代码创建了一个/META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/"/>

但是在我重新启动服务器部署后,它仍然无法在“/”处加载上下文,它仍然使用"/&lt;WEB_APP_NAME&gt;" 加载它

任何有用的指针。

【问题讨论】:

标签: tomcat tomcat7 root context.xml


【解决方案1】:

你可以做的是以下;

&lt;catalina_home&gt;/conf/Catalina/localhost/中添加一个名为ROOT.xml的文件

此 ROOT.xml 将覆盖该引擎和主机(Catalina 和 localhost)的 tomcat 安装的根上下文的默认设置。

在 ROOT.xml 文件中输入以下内容;

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

这里,&lt;yourApp&gt; 是您的应用程序的名称.. :)

然后,您的应用程序现在是默认应用程序,并将显示在http://localhost:8080

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

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

然后就应该没问题了!

【讨论】:

  • 这是否适用于常规 webapps 文件夹中的其他战争?
  • 查看文档tomcat.apache.org/tomcat-7.0-doc/config/context.html docbase 是路径/to/yourApp,路径必须是“”(所以是一个空字符串),表示根上下文
  • 为了解决双重部署,您还可以在server.xml中将Host属性的“deployOnStartup”和“autoDeploy”都设置为false
  • 我发现如果您不重命名 /webapps 下的默认 ROOT 文件夹“猫回来了”,它会重置 ROOT.xml 中的 docBase。这是使用 VMWare 的 vfabric tc 开发服务器...请注意。
  • 现在 Tomcat 7 似乎不允许在 /webapps 中使用 docBase,因此似乎必须在其他地方找到 war 文件。
【解决方案2】:

这是对我有用的唯一解决方案。将以下内容添加到conf/server.xml 文件中的Host node

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

</Context>

更新:
它可以是:conf/server.xml
或在:conf/context.xml

【讨论】:

  • 将在server.xmlcontext.xml?我在 context.xml 中看到了一个 xml 标签 &lt;Context&gt;
  • server.xml 中还有一个 context xml 标签但是不鼓励使用 server.xml 来定义上下文
【解决方案3】:

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

【讨论】:

  • 它正在工作,但如果设置了 autoDeploy="true" 则会导致双重部署。接受的答案已经解决了这个问题。 2、不推荐直接在server.xml中添加Context部分。 tomcat.apache.org/tomcat-9.0-doc/config/…
【解决方案4】:

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

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

【讨论】:

  • 这是server.xml?根据例如Ali.Mojtehedy 上面那是有问题的。此外,其他答案指出 /path/to 需要位于正常 webapps 路径的外部
  • 似乎工作正常。当然,您不希望 ROOT 应用存在于同一个 webapps 文件夹中与您的冲突。
【解决方案5】:

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

您可以在 web-application META-INF 目录下放置一个 context.xml 配置文件,其中包含上下文路径设置。这会覆盖默认服务器设置吗?

即:

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

【讨论】:

    【解决方案6】:

    最快且可能是最好的解决方案是在&lt;TOMCAT_INSTALL_DIR&gt;/conf/Catalina/localhost/ROOT.xml 中包含以下内容

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

    您的网络应用程序将在http://&lt;host&gt;:&lt;port&gt;/ 提供

    【讨论】:

    • docBase 目录是绝对目录还是相对于特定文件夹?
    • 我试过这个,但它不起作用。我在/opt/tomcat/webapps/Foobar 中有一个名为Foobar 的应用程序。我尝试将 docBase 设置为 Foobar/opt/tomcat/webapps/Foobar,但是当我转到 `http://:/ 时,我仍然看到 Tomcat 主页而不是我的 Foobar 应用程序。我什至重新启动了Tomcat。我做错了什么?
    • 当我将路径设为空时,它不会到达我的应用程序):
    【解决方案7】:

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

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

    在 conf/catalina/webapps 文件夹名中 并将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 与 app2 相同,您可能在 app1 中,您可以在通过服务器端会话登录后自动登录到 app2 ?! 因此,您必须将用户会话保留在客户端缓存中,而不是使用 jsessionid ! 我们可以从 localhost 更改引擎名称来解决它。 但是说玩tomcat比玩其他猫需要更多的时间!

    【讨论】:

      【解决方案8】:

      &lt;Context docBase="yourAppName" path="" reloadable="true"&gt;

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

      【讨论】:

        【解决方案9】:

        雄猫 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文件夹中。

        【讨论】:

          【解决方案10】:

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

          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。

          1. 但是,我更喜欢将我的战争名称转换为 ROOT.war 并将其放在 webapps 下。所以现在来自其他战争(上下文路径)的无与伦比的 url 请求将进入这场战争。这是处理 ROOT ("/**") 上下文路径的更好方法。

          第二个选项是(双重)从 Webapps 文件夹加载战争。而且它只需要解压缩的war文件夹,这很头疼。

          【解决方案11】:

          在Tomcat 8.X中,在tomcat主目录/conf/文件夹下的server.xml中,您可以在&lt;Host&gt;标签下添加&lt;Context&gt;标签,如下图所示。但是你必须重启服务器才能生效

            <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/&lt;Your App Directory Name&gt;/localhost:8080/&lt;your app path you wish&gt;/ 这两个 URL 同时工作。在$CATALINA_HOME/webapps/下找到这两个解压文件夹。
          【解决方案12】:

          最简单灵活的解决方案如下: ${Tomcat_home}/config/server.xml 内部

          Host 元素下更改 autoDeploy="false" deployOnStartup="false",如下所示这是必须的。

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

          Host 元素下添加以下行。

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

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

          【讨论】:

          • 没有上述配置的 doinf 的替代解决方案只是将您的 war 文件重命名为 root.war 并将其放在 webapps 目录下。上下文路径将自动设置为 /。
          【解决方案13】:

          下面的技巧对我有用。

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

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

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

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

          【讨论】:

          • 来自问题:“我知道我可以将我的 web 应用程序(或它的 WAR 文件)重命名为 ROOT,但这是一种糟糕的方式,恕我直言。”
          • 我不想限制自己每个 tomcat 实例只使用一个 webapp。
          猜你喜欢
          • 2022-01-17
          • 2016-05-05
          • 2013-07-16
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 2012-04-20
          • 2017-10-06
          相关资源
          最近更新 更多