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

时间:2011-09-01 21:51:26

标签: tomcat tomcat7 root context.xml

我知道我可以将我的webapp(或它的WAR文件)重命名为 ROOT ,但这是一种可怕的方法,恕我直言。现在我查看了tomcat doc&它说

  

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

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

  

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

所以我使用以下代码

创建了/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/"/>

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

加载它

任何有用的指针。

13 个答案:

答案 0 :(得分:219)

您可以做的是以下内容;

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

然后一切都好!

答案 1 :(得分:13)

以下是唯一适合我的解决方案。将其添加到conf / server.xml

中的Host节点
<Context path="" docBase="yourAppContextName">

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

</Context>
  

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

答案 2 :(得分:3)

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

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

答案 3 :(得分: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"/>

答案 4 :(得分:2)

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

中包含以下内容
<Context 
  docBase="/your_webapp_location_directory" 
  path="" 
  reloadable="true" 
/>

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

上提供

答案 5 :(得分:1)

我遇到这个问题已经有一个月了,在server.xml中放置上下文标签是不安全的,它会影响为所有其他主机部署的上下文元素,对于大型应用程序,它需要连接错误也不是很好的隔离,例如你可以访问其他网站文件夹名称domain2.com/domain1Folder !!还加载了两次数据库会话连接! 另一种方法是将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一起玩需要比与其他猫玩更多的时间!

答案 6 :(得分:1)

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

  

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

答案 7 :(得分: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文件夹中。

答案 8 :(得分:1)

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

  1. 在/ conf / Catalina / localhost /
  2. 中添加名为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.war并将其放置在webapps下。因此,现在其他战争(contextpaths)发出的无与伦比的url请求将落入这场战争。这是处理ROOT(“ / **”)上下文路径的更好方法。

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

答案 9 :(得分:0)

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

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

即:

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

内部

Host 元素下更改 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下添加尽可能多的应用程序。

答案 12 :(得分:-6)

以下技巧对我有用。

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

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

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

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