Tomcat的appBase,docBase,path关系
文章目录
1. 结论在最前面
结论:
- 默认情况下(appBase=webapps,无Context标签),会把webapps目录下的war包解压到webapps目录,要带包名访问
- appBase指定目录下的war包都会被自动解压为对应的包,例如demo.war会被解压到demo目录下。
- war包位置,是根据appBase + docBase来确定的
- war包解压的目录,是根据appBase + path来确定的,path为/则默认会解压到ROOT目录,path="/a",则会解压在a目录。
- ROOT或a目录所在的目录,是appBase来确定的。如果appBase="",则在tomcat根目录;如果appBase=“webapps”,则目录生成在webapps目录下。
在看例子前,要特别注意的是,如果webapps="",则默认tomcat根目录会被发布出来,可以通过http://localhost:8080/conf/context.xml直接拿到context.xml内容,如果恰好我们是使用JNDI数据源,则可能泄露DB的账号密码!
举例:(war包里接收/sample的请求)
- appBase=“webapps”,没有Context标签。只会默认解压webapps目录下的war包。
- appBase=“webapps”,docBase="/demo" path="/",war包在webapps/demo.war。这时会启动2遍。第一遍是默认解压webapps目录下的war包;第二遍是根据appBase+docBase(即webapps/demo.war)找到war包,解压到appBase+path(即webapps/ROOT)目录下。
- 最终在webapps目录下有2个文件件:ROOT和demo
- 可以通过http://localhost:8080/sample或http://localhost:8080/demo/sample访问
- appBase=“webapps”,docBase="/demo" path="/a",war包在webapps/demo.war。这时会启动2遍。第一遍是默认解压webapps目录下的war包;第二遍是根据appBase+docBase(即webapps/demo.war)找到war包,解压到appBase+path(即webapps/a)目录下。
- 最终在webapps目录下有2个文件件:a和demo
- 可以通过http://localhost:8080/demo/sample或http://localhost:8080/a/sample访问
- appBase="",docBase="/demo" path="/",war包在tomcat根目录下demo.war。这时会启动2遍。第一遍是默认解压tomcat根目录下的war包;第二遍是根据appBase+docBase(即tomcat根目录下找demo.war)找到war包,解压到解压到appBase+path(即tomcat根目录下的ROOT)目录下。
- 最终在tomcat根目录下有2个文件件:ROOT和demo
- 可以通过http://localhost:8080/sample或http://localhost:8080/demo/sample访问
- appBase="",docBase="/demo" path="/a",war包在tomcat根目录下demo.war。这时会启动2遍。第一遍是默认解压tomcat根目录下的war包;第二遍是根据appBase+docBase(即tomcat根目录下找demo.war)找到war包,解压到解压到appBase+path(即tomcat根目录下的a)目录下。
- 最终在tomcat根目录下有2个文件件:a和demo
- 可以通过http://localhost:8080/demo/sample或http://localhost:8080/a/sample访问
2. server.xml关于appbase和context配置
2.1. war包在webapps目录下;appbase=“webapps”;无context配置
启动后:
访问:
http://localhost:8080/demo/sample
demo是包名,要加
结论:
- webapps目录下的war包会自动解压
- 访问的时候需要带上包的名字(这里是demo)
2.2. war包在webapps目录下;appbase="";有context配置
启动后:
访问:
http://localhost:8080/sample
结论:
- webapps目录下的war包会自动解压到tomcat根目录的ROOT文件夹下
- 由于server.xml中的
<Context>
标签中path是\,访问的时候不用带包名
2.3. war包在webapps目录下;appbase=“webapps”;有context配置(相对路径)
启动后:
启动会报错,查看日志如下
结论:
- 去找war包,docBase的目录如果是相对路径,那么就是相对appBase来看的。这里appBase是webapps,那么加上docBase,就是要去找webapps\webapps\demo。
- 如果这里docBase配置为"/demo",就可以自动解压在webapps目录下,并且通过http://localhost:8080/sample或者http://localhost:8080/demo/sample都可以访问,因为:
此时,如果在webapps目录下再建一个webapps目录,把war包放进去:
启动(war包会解压到tomcat/webapps/ROOT目录下):
访问:
http://localhost:8080/sample
结论:
- war包的位置是根据appBase + docBase来定的
- war包会默认解压到webapps目录的ROOT下(看起来ROOT总是在war包的上一层目录)
2.4. war包在webapps目录下;appbase=“webapps”;有context配置(绝对路径)
启动后(在webapps目录下会生成ROOT目录,war包解压到这里):
访问:
http://localhost:8080/sample
结论:
- 如果docBase是绝对目录,就不再参考appBase,直接去找war包
- 找到的war包,会自动解压到webapps的ROOT目录下
2.5. war包在tomcat根目录下;appbase="";有context配置(/demo)
启动后,会自动解压demo.war,并且在tomcat根目录下生成ROOT文件夹,同时也会启动2遍