在Tomcat的根目录部署我的应用程序


132

我有我的申请文件。我需要在根级别进行部署。当前网址为http://localhost:8080/war_name/application_name


1
请问您到底是什么问题?在tomcat中部署war文件时,可以使用URL:localhost:8080 / war_name来访问该应用程序,而没有.war扩展名。
ashishjmeshram 2011年

1
是的,您是对的,我需要访问我的应用程序。“ localhost / application_name ”,当我将我的战争文件重命名为“ ROOT.war”时,我可以达到此目的,但是由于我的战争文件大小约为120MB,它抛出了内存不足异常
iamjustcoder 2011年

1
@ user661660-似乎您有另一个问题-重命名为ROOT.war应该可以工作。我建议询问有关您的另一个问题OutOfMemoryException,提供堆栈跟踪和详细信息。您可能可以通过配置-XmxJVM 来解决它。
罗布·赫鲁斯卡

.lang.OutOfMemoryError:PermGen空间2011年3月16日上午9:52:52 com.ebay.kernel.logger.Logger日志严重:Perfmon线程java.lang.OutOfMemoryError:PermGen空间中的错误线程“ CalClient:NotifyThreadDestroyThread-0” “ java.lang.OutOfMemor yError:线程“ MetricsSnapshotScheduler”中的PermGen空间异常java.lang.OutOfMemoryError:PermG en space 2011年3月16日上午9:53:36 com.ebay.kernel.logger.Logger日志SeverE:Perfmon错误线程java.lang.OutOfMemoryError:PermGen空间线程“ CalClient:NotifyThreadDestroyThread-0”中的异常java.lang.OutOfMemor yError:PermGen空间
iamjustcoder 2011年

1
@ user661660-也许这个问题的一些答案可以帮助您。
罗布·赫鲁斯卡

Answers:


220

您有两种选择:

  1. ROOT/从tomcat 中删除现成的目录,并ROOT.war在部署它之前将war文件重命名为。

  2. 部署战争(从你的例子)war_name.war,并配置上下文根conf/server.xml使用你的war文件:

    <Context path="" docBase="war_name" debug="0" reloadable="true"></Context>

第一个比较容易,但是有点混乱。第二种可能是更优雅的方法。


3
如果Tomcat设置为自动部署,您不必担心选项2
Buhake辛迪

4
@Dejel-从技术上讲没什么。我自己做了很多。它完成了工作。不得不将自己的war文件重命名为某种类似于容器实现细节的感觉,这有点奇怪。
罗布·赫鲁斯卡

4
按照您提供的链接,不建议将<Context>元素直接放置在server.xml文件中
Nilesh

6
该答案推荐了一种技术,该技术在文档中明确提到为不良形式。正确的技术在这里详细描述:stackoverflow.com/questions/41263245/...
克里斯托弗·舒尔茨

5
+1称为ROOT.war。根据Tomcat文档,在指定“路径”时要非常小心,以避免双重部署:“即使在server.xml中静态定义上下文时,也必须设置此属性,除非docBase不在主机的目录下。 appBase或deployOnStartup和autoDeploy均为false。如果不遵循此规则,则可能导致双重部署。” -从tomcat.apache.org/tomcat-8.0-doc/config/context.html
安东尼·海沃德

31

在tomcat v.7(香草安装)上

在conf / server.xml文件的结尾处,在</Host>结束标记之前添加以下位:

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

注意docBase属性。这很重要。您可以先确定已部署app_name,然后再更改根Web应用程序,或者只是将解压缩的Webapp(app_name)复制到tomcat的webapps文件夹中。启动,访问root,在那里查看您的app_name!


13

在具有这些更改的tomcat 7中,我能够在/处访问myAPP并在/ ROOT处访问ROOT

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

将以上内容添加到<Host>server.xml中的部分


3
上下文路径必须为空字符串或以“ /”开头。路径[ROOT]不符合这些条件,并已更改为[/ ROOT]
Nikita Bosik

11

我知道我的答案与其他答案有些重叠,但这是一个完整的解决方案,具有一些优点。这适用于Tomcat 8:

  1. 主应用程序从根提供
  2. 通过Web界面保留war文件的部署。
  3. 当只有管理员可以访问管理文件夹时,主应用程序将在端口80上运行(我意识到* nix系统需要超级用户才能绑定到80,但是在Windows上这不是问题)。

这意味着您只需重启一次tomcat,并且在部署更新的war文件之后就不会出现问题。

步骤1:在server.xml文件中,找到连接器条目并将其替换为:

<Connector 
    port="8080"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

<Connector
    port="80"
    protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

步骤2:在<Host ...>标记内定义上下文:

<Context path="/" docBase="CAS">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/ROOT" docBase="ROOT">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
<Context path="/host-manager" docBase="host-manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

请注意,我处理了webapp文件夹中的所有应用程序。第一个有效地切换了根目录和主应用程序的位置。ROOT现在已打开http://example.com/ROOT,主要应用程序已打开http://example.com/。受密码保护的Web应用需要此privileged="true"属性。

部署与根目录匹配的CAS.war文件时(<Context path="/" docBase="CAS">您必须在管理面板中重新加载该因为它不会随部署刷新。

不要<Context path="/CAS" docBase="CAS">在您的上下文中包含,因为它会禁用管理员选项来部署War文件。这意味着您可以通过两种方式访问​​该应用程序:http://example.com/http://example.com/APP/

步骤3:为了防止不必要地访问根目录和管理器文件夹,请valve向这些上下文标记添加a ,如下所示:

<Context path="/manager" docBase="manager" privileged="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        addConnectorPort="true"
        allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/>
</Context>

当他们使用默认端口8080时,这实际上限制了来自我自己的域(伪IP地址)和本地主机的人对admin Web应用程序文件夹的访问,并保持了通过Web界面动态部署war文件的能力。

如果要将它用于使用不同IP地址的多个应用程序,则可以将IP地址添加到连接器(address="143.21.2.1")。

如果要从根目录运行多个Web应用程序,则可以复制Service标记(第二个使用不同的名称),然后将的文档库更改<Context path="/" docBase="CAS"><Context path="/" docBase="ICR">


6

最快的方法。

  1. 确保您尚未部署ROOT应用,如果已部署,请取消部署

  2. 将您的战争重命名为ROOT.war,进行部署,仅此而已,无需更改配置


6

删除$CATALINA_HOME/webapps/ROOT。更新$CATALINA_HOME/conf/server.xml,确保Host元素看起来像以下文本:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="" docBase="myApp"></Context>

它与Tomcat 8一起使用。autoDeploy和deployOnStartup需要设置为false,以防止tomcat部署myApp两次。


我尝试上传WAR,但无法正常工作。这仅适用于爆炸的战争吗?
logixplayer

我尝试上传WAR,但根据@Jingguo的示例,它无法正常工作。这仅适用于爆炸的战争吗?编辑:这确实只适用于爆炸战争。为什么是这样?我不仅可以上传WAR并避免此双重步骤吗?我该如何运作?
logixplayer

@logixplayer。我的解决方案适用于WAR。我没有爆炸。我忘了提到$CATALINA_HOME/webapps/ROOT需要删除的内容。请删除它,然后重试。
姚敬国

如您所说,我删除了ROOT。我部署了WAR(未分解的目录)。我注意到创建了一个新的ROOT目录,其中包含我的内容,例如WEB-INF。该站点正在运行。这是应该工作的方式吗?
logixplayer

我也尝试过这种方法,当我尝试在浏览器中打开页面时,它只会一直在等待服务器。catalina.out仅表示服务器已启动。
阿苏2015年

1

添加到@Rob Hruska的sol上,在server.xml内部的此设置有效:

<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>

注意:在某些情况下可能需要override =“ true”。


您没有提到要放在哪里。@Sudheer Palyam的回答很有帮助。
Kannan Ramamoorthy

1

添加到@Dima的答案中,如果您正在使用它maven来构建软件包,则可以告诉它将WAR文件名设置为ROOTin pom.xml

<build>
    <finalName>ROOT</finalName>
</build>

默认情况下,tomcat会将ROOT.warwebapp 部署到根上下文(/)中。


0

打开tomact管理器url:-http:// localhost:8080 / manager / html /,
然后在应用程序中看到部署路径为“ /”的应用程序,
只需取消部署即可。应用程序的war文件重命名ROOT.war,然后将其放置在路径中:- 启动Tomcat。不需要任何额外的配置。 现在我们可以在http:// localhost:8080看到我们的应用程序主页或配置的url
在此处输入图片说明
C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps


-1

在我的服务器上,我正在使用它,root自动部署工作正常:

   <Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true">
        <Alias>www.mysite.com</Alias>
        <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="mysite_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b"/>
        <Context path="/mysite" docBase="mysite" reloadable="true"/>
    </Host>

这不会部署到/而是部署到/ mysite
tine2k
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.