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 "%r" %s %b" /> </Host>
Tomcat里appBase和docBase的区别
首先明确appBase和docBase都是指定tomcat要部署的应用所在的目录;
appBase配置的目录(是指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录.)表示:
- 这个目录下面的子目录将自动被部署为应用。
- 这个目录下面的.war文件将被自动解压缩并部署为应用
docBase只是指向了你某个应用的目录(指定Web应用的文件路径.可以给定绝对路径,也可以给定相对于Host的appBase属性的相对路径)
总结:
- 如果你想自己指定路径,那么应该在docBase里面
- 如果你想简单,那么直接把他们复制到appBase下面就行了
- appBase目录只能包含应用,是应用的父级目录,而不能是一个应用目录;如果不配置Context指定应用docBase和path,则下属应用的docBase就是该应用名称,path就是 “/应用名”;
- docBase目录应用所在路径,可以是磁盘绝对路径,也可以是相对appBase路径,如果配置相对路径,则应用部署两次
示例1
比如你的应用为myApp, 放在了d:\project\myApp,里面有2个子目录d:\project\myApp\images和d:\project\myApp\js
你可以通过
- 设置 appBase 指向 d:\project 来让系统自动部署
- 你可以手工指定docBase到 d:\project\myApp
- 如果你指定了 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>配置中包含如下信息:
- 配置docBase值为:docBase="app"或者docBase="app.war",即项目war包名称或者全名;
- path为空,表示app为tomcat默认应用;
同时,将app.war部署在${CATALINA_HOME}/webapps/路径下。
实际上,tomcat部署应用程序的顺序是这样的(tomcat启动日志):
1.最先部署${CATALINA_HOME}/webapps/路径下的ROOT应用,该应用为tomcat的默认应用程序,访问时不用带应用上下文路径,即:http://host:port/xxx。
2.然后再按照字母顺序升序依次部署其他应用程序,如:appA,appB等等。
说明:
- 当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。
- 当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/...