【问题标题】:Deploying my application at the root in Tomcat在 Tomcat 的根目录下部署我的应用程序
【发布时间】:2011-07-16 18:10:50
【问题描述】:

我有我的应用程序的战争文件。我需要在根级别部署它。当前网址是http://localhost:8080/war_name/application_name

【问题讨论】:

  • 您能否具体说明您的问题是什么?当您在 tomcat 中部署 war 文件时,使用 URL 访问应用程序:localhost:8080/war_name 不带 .war 扩展名。
  • 是的,你是对的,我需要访问我的应用程序。 “localhost/application_name”,当我将我的战争文件重命名为“ROOT.war”时,我可以实现这一点,但是由于我的战争文件大小约为 120MB,它会抛出内存异常
  • @user661660 - 似乎您遇到了不同的问题 - 重命名为 ROOT.war 应该可以。我建议再问一个关于您的OutOfMemoryException 的问题,提供堆栈跟踪和详细信息。您可以通过为 JVM 配置 -Xmx 来绕过它。
  • .lang.OutOfMemoryError: PermGen space Mar 16, 2011 9:52:52 AM com.ebay.kernel.logger.Logger 日志严重:Perfmon 线程 java.lang.OutOfMemoryError 中的错误:PermGen 空间异常在线程“CalClient:NotifyThreadDestroyThread-0”中 java.lang.OutOfMemoryError: PermGen space 异常在线程“MetricsSnapshotScheduler” java.lang.OutOfMemoryError: PermG en space Mar 16, 2011 9:53:36 AM com.ebay.kernel.logger .Logger 日志严重:Perfmon 线程 java.lang.OutOfMemoryError 中的错误:PermGen space 线程“CalClient:NotifyThreadDestroyThread-0”中的异常 java.lang.OutOfMemory yError:PermGen 空间
  • @user661660 - 也许answers for this question 中的一些可以帮助你。

标签: java tomcat


【解决方案1】:

你有几个选择:

  1. 从 tomcat 中删除开箱即用的 ROOT/ 目录,并将您的 war 文件重命名为 ROOT.war,然后再进行部署。

  2. 将您的战争部署为(来自您的示例)war_name.war,并在conf/server.xml 中配置context root 以使用您的战争文件:

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

第一个更容易,但更笨拙。第二种可能是更优雅的方式。

【讨论】:

  • 如果 Tomcat 设置为自动部署,则不必担心选项 2。
  • @Dejel - 从技术上讲没什么。我自己做了很多。它完成了工作。不得不将自己的 war 文件重命名为某种容器的实现细节,这感觉有点奇怪。
  • 根据您提供的链接不建议将 元素直接放在 server.xml 文件中
  • 此答案推荐了一种在文档中明确提及为错误形式的技术。此处详细介绍了正确的技术:stackoverflow.com/questions/41263245/…
  • +1 将其称为 ROOT.war。根据 Tomcat 文档,在指定“路径”以避免双重部署时需要非常小心:“即使在 server.xml 中静态定义上下文时,也不得设置此属性,除非 docBase 不位于主机的appBase 或 deployOnStartup 和 autoDeploy 都为 false。如果不遵循此规则,可能会导致双重部署。 - 来自tomcat.apache.org/tomcat-8.0-doc/config/context.html
【解决方案2】:

在 tomcat v.7 上(原版安装)

在您的 conf/server.xml 中,在文件末尾添加以下位,就在 &lt;/Host&gt; 结束标记之前:

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

注意 docBase 属性。这是重要的一点。您要么确保在更改根 Web 应用程序之前已部署 app_name,要么将解压缩的 webapp (app_name) 复制到 tomcat 的 webapps 文件夹中。启动,访问 root,在那里查看你的 app_name!

【讨论】:

    【解决方案3】:

    在进行了这些更改的 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>
    

    将上面添加到 server.xml 中的 &lt;Host&gt; 部分

    【讨论】:

    • 上下文路径必须是空字符串或以“/”开头。路径 [ROOT] 不符合这些条件,已更改为 [/ROOT]
    【解决方案4】:

    最快的方法。

    1. 确保您没有部署 ROOT 应用,如果有,请取消部署

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

    【讨论】:

      【解决方案5】:

      在我的服务器中,我正在使用它,并且 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
      【解决方案6】:

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

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

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

      【讨论】:

      • 你没有提到把这个放在哪里。 @Sudheer Palyam 的回答很有帮助。
      【解决方案7】:

      删除$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,但没有成功。这仅适用于爆炸的 WAR 吗?
      • 我尝试上传 WAR,但基于@Jingguo 的示例无法正常工作。这仅适用于爆炸战争吗?编辑:这确实只适用于爆炸战争。为什么是这样?我可以不只是上传 WAR 并避免这个双重步骤吗?我怎样才能让它发挥作用?
      • @logixplayer。我的解决方案适用于 WAR。我没有把它炸开。我忘了提到需要删除$CATALINA_HOME/webapps/ROOT。请删除并重试。
      • 我按照你说的删除了ROOT。我部署了我的 WAR(不是展开的目录)。我注意到创建了一个新的 ROOT 目录,其中包含我的东西,例如网络信息。该网站正在运行。这是它应该工作的方式吗?
      • 我也尝试过这种方法,当我尝试在浏览器中打开页面时,它一直在等待服务器。 catalina.out 只表示服务器已启动。
      【解决方案8】:

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

      1. 主应用程序从根提供服务
      2. 通过网络界面部署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 步: 在&lt;Host ...&gt; 标签内定义上下文:

      <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 文件时(&lt;Context path="/" docBase="CAS"&gt;,您必须在管理面板中重新加载该文件,因为它不会随着部署而刷新。

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

      第 3 步: 为了防止对根目录和管理器文件夹的不必要访问,请将valve 添加到这些上下文标签中,如下所示:

      <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 地址)和 localhost 的人员访问 admin Web 应用程序文件夹,并保持了通过 Web 界面动态部署 war 文件的能力。

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

      如果您想从根目录运行多个网络应用,您可以复制服务标签(第二个使用不同的名称)并将&lt;Context path="/" docBase="CAS"&gt; 的文档库更改为例如&lt;Context path="/" docBase="ICR"&gt;

      【讨论】:

        【解决方案9】:

        打开 tomact 管理器网址:- http://localhost:8080/manager/html/
        然后在应用程序中,您会看到部署了路径为“/”的应用程序
        只需取消部署即可。
        重命名您的应用程序的war文件为ROOT.war,然后放在路径:-
        C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps
        启动您的 Tomcat 无需额外配置。
        现在我们可以在http://localhost:8080看到我们的应用程序主页或配置的url

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2015-02-11
            • 2014-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-29
            • 1970-01-01
            相关资源
            最近更新 更多