166

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

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

任何指针都有帮助。

4

13 回答 13

243

您可以执行以下操作;

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

然后应该一切正常!

于 2011-10-09T22:20:52.317 回答
14

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

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

</Context>

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

于 2013-03-25T22:22:14.737 回答
6

在 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"/>
于 2017-03-05T07:41:09.907 回答
3

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

<Host name="my.host.name" >
   <Context path="" docBase="/path/to/myapp.war"/>
</Host>
于 2013-06-20T15:59:27.013 回答
3

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

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

IE:

<Context docBase="yourAppName" path="/yourAppPath" reloadable="true">
于 2015-01-16T04:28:57.447 回答
2

最快且可能是最好的解决方案是在<TOMCAT_INSTALL_DIR>/conf/Catalina/localhost/ROOT.xml

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

您的网络应用程序将在http://<host>:<port>/

于 2014-05-18T13:29:03.333 回答
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。

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

第二个选项是(双重)从 Webapps 文件夹加载战争。此外,它只需要未压缩的战争文件夹,这是一个令人头疼的问题。

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

于 2014-03-20T22:08:38.647 回答
1

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

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

于 2017-01-11T12:11:56.480 回答
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文件夹中。

于 2018-04-03T19:43:40.023 回答
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" />
于 2018-11-19T14:46:23.880 回答
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 下添加尽可能多的应用程序。

于 2019-05-23T06:17:11.390 回答
-6

下面的技巧对我有用。

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

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

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

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

于 2013-10-17T06:35:13.943 回答