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

Posted

技术标签:

【中文标题】如何在 Tomcat 7.0 中设置 Web 应用程序的上下文路径【英文标题】:How to set the context path of a web application in Tomcat 7.0 【发布时间】: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 8 WARNING: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path "/" does not meet these criteria and has been changed to ""987654321@提交过错误 文档中给出的“不建议将元素直接放置在 server.xml 文件中”的原因如下一句:“这是因为它使修改上下文配置更具侵入性,因为如果不重新启动 Tomcat,则无法重新加载主 conf/server.xml 文件。”下面接受的答案直接解决了问题,但是如果你不太可能再次修改这个路径或者重启不会造成太大的破坏,那么修改 server.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】:

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

    在 /conf/Catalina/localhost/ 中添加一个名为 ROOT.xml 的文件
<Context
    docBase="/tmp/wars/hpong"
  path=""
  reloadable="true"
/>
    在 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。

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

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

【讨论】:

coderanch.com/t/494034/application-servers/… ***.com/questions/36594644/…【参考方案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。

以上是关于如何在 Tomcat 7.0 中设置 Web 应用程序的上下文路径的主要内容,如果未能解决你的问题,请参考以下文章

在tomcat 7中设置默认应用程序

如何在idea中设置tomcat热部署

如何在 Openshift Tomcat 7 (JBOSS EWS 2.0) 中设置休眠 MySQL 连接?

关于webapp——session存储时间

Java设置session超时(失效)的时间

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作