tomcat部署应用时设置应用上下文路径content path

问题解决的配置定位


主要是配置/data/install/apache-tomcat-x.x.x/conf/server.xml文件里的host属性以及content属性

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!-- <Context docBase="cat" path="" reloadable="false" /> -->
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

 

Tomcat里appBase和docBase的区别


 

首先明确appBase和docBase都是指定tomcat要部署的应用所在的目录;

appBase配置的目录(是指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录.)表示:

  1. 这个目录下面的子目录将自动被部署为应用。
  2. 这个目录下面的.war文件将被自动解压缩并部署为应用

docBase只是指向了你某个应用的目录(指定Web应用的文件路径.可以给定绝对路径,也可以给定相对于Host的appBase属性的相对路径)

总结

  1. 如果你想自己指定路径,那么应该在docBase里面
  2. 如果你想简单,那么直接把他们复制到appBase下面就行了
  3. appBase目录只能包含应用,是应用的父级目录,而不能是一个应用目录;如果不配置Context指定应用docBase和path,则下属应用的docBase就是该应用名称,path就是   “/应用名”;
  4. docBase目录应用所在路径,可以是磁盘绝对路径,也可以是相对appBase路径,如果配置相对路径,则应用部署两次

示例1

比如你的应用为myApp, 放在了d:\project\myApp,里面有2个子目录d:\project\myApp\images和d:\project\myApp\js

你可以通过

  1. 设置 appBase 指向 d:\project 来让系统自动部署
  2. 你可以手工指定docBase到 d:\project\myApp
  3. 如果你指定了 appBase到 d:\project\myApp 那么d:\project\myApp\images这个将不再是普通的子目录,而是一个单独的虚拟目录,或者叫应用了。因为其被自动部署;d:\project\myApp\js 也一样的后果

示例2

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="ture" >
  <Context path="" docBase="aaa" debug="0" reloadable="true"/>
</Host>

结果就是项目加载部署了两遍

第一遍:webapp下所有的文件夹部署(虽然我只有一个aaa文件夹)(访问路径   localhost:8080/aaa/.....)

第二遍:指定docBase为aaa文件夹又走了一遍,且path为空(l访问路径   localhost:8080/......)

这两个域名都能走!!!

 

 <CATALINA_HOME>的webapps目录下ROOT目录和其他应用目录


在tomcat配置文件目录conf目录下的server.xml中添加<Context>元素,配置如下:

<Context docBase="app" path="" reloadable="false" />

在<Context>配置中包含如下信息:

  1. 配置docBase值为:docBase="app"或者docBase="app.war",即项目war包名称或者全名;
  2. path为空,表示app为tomcat默认应用;

同时,将app.war部署在${CATALINA_HOME}/webapps/路径下。

实际上,tomcat部署应用程序的顺序是这样的(tomcat启动日志):
1.最先部署${CATALINA_HOME}/webapps/路径下的ROOT应用,该应用为tomcat的默认应用程序,访问时不用带应用上下文路径,即:http://host:port/xxx。
2.然后再按照字母顺序升序依次部署其他应用程序,如:appA,appB等等。

说明:

  1. 当webapps路径下没有ROOT目录

    如果在部署app时删除了${CATALINA_HOME}/webapps/路径下的ROOT目录(即删除tomcat默认应用),

    那么在tomcat启动时,会首先在CATALINA_HOME/webapps/路径下创建名称为ROOT的目录,然后将文件app.war中的内容拷贝到ROOT目录下,开始部署ROOT应用程序。

    接下来才会解压app.war,再部署app应用。

    从tomcat的启动日志可以很容易知道,在这种情况下app应用会被加载2次,一次是部署ROOT时加载的,另一次是部署app本身加载的。

    因此,访问应用可以带应用上下文路径,也可以不用带上下文路径,即:http://host:port/xxx或者http://host:port/app/xxx。

  2. 当webapps路径下存在ROOT目录

    如果在部署app时不删除${CATALINA_HOME}/webapps/路径下的ROOT目录,即已经存在默认应用程序。

    此时在tomcat启动时,会先部署ROOT默认应用(注意:已经存在ROOT应用,不再会拷贝app.war文件内容到ROOT下)。然后解压app.war,部署app应用。显然,app应用只被部署一次!

    因此,在这种情况下,即便配置了<Context>元素的path为空,但是访问app应用时还是必须携带应用上下文路径,即:http://host:port/app/xxx。

 

 

多个应用,指定了多个Context,那就必须都配上path


 

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false">
  <Context path="aaa" docBase="testa" debug="0" reloadable="true"/>
  <Context path="bbb" docBase="testb" debug="0" reloadable="true"/>
</Host>

有多个context,就要配上多个path,这样才能根据不同的项目走不通的路径

也就是说

testa应用走的是localhost:8080/aaa/...

testb应用走的是localost:8080/bbb/...

 

posted @ 2021-03-27 21:37  ^^ITBOY^^  阅读(7221)  评论(0编辑  收藏  举报