通常在 tomcat 中,应用默认部署在 $CATALINA_HOME/webapps 下,部署后通过 http://ip:port/context-path 进行访问。
不过还应注意到,tomcat 中有一个特别的默认 web 应用 ROOT,部署后可以通过 http://ip:port 访问,即没有 URL 中的 context-path,它表示处理所有未关联到某个具体 context 的请求(http[s] request)。如 webapps 下的 tomcat 一览页应用就部署成了 ROOT,直接通过 http://localhost:8080 访问。
通常当服务器有独立的域名,或就是希望忽略应用名称时,会希望直接将应用部署成 ROOT 应用,访问时会更加方便。下面记录部署成 ROOT 应用的 3 种方法。
注:
- ROOT 为 tomcat 默认 web 应用。
- ip 和 port 以 tomcat 默认的 localhost 和 8080 作为示例。
- 下文中,以 myroot 应用为示例,应用下仅有 index.jsp 文件。
webapps 下已有 ROOT 应用,可以将其删除,然后将自己的 ROOT.war 直接或解压后部署在 webapps 下。
一般不建议着么做,因为限定了应用的名称必须是 ROOT,无法通过名称直接反应应用的信息,不利于将来的维护。
server.xml 位于 $CATALINA_HOME/conf 下。找到其中的 <Host/> 标签,在其下插入 <Context/> 标签,最简单的形式如下:
<Context path="" docBase="myroot" />
path 属性必须为空,才表示 ROOT 应用,否则就是具体的 context-path。myroot 应用位于部署目录(默认为 webapps)下,此时会导致两个问题:
http://localhost:8080/ROOT 访问,将会发现返回 404。双重部署,指同一个应用在 tomcat 容器中表现为两个独立的应用,也就是两个独立的 context。以此处的 myroot 为例,无论通过 http://localhost:8080 或是 http://localhost:8080/myroot 都可访问 myroot,但它们是两个独立的 context。如何验证呢,编辑 index.jsp 文件,内容只包含如下一行:
<% System.out.println(application); %>
当以 http://localhost:8080 和 http://localhost:8080/myroot 访问时会发现 tomcat terminal 中输出不同的 application 实例。
双重部署显然不是期望的副作用。可通过两种方式克服:
不部署在默认部署目录(默认为 webapps)下,如:
<Context path="" docBase="/path/not/appBase/myroot" />
父级 <Host/> 标签的 deployOnStartup 和 autoDeploy 属性同时设置为 false。
修改 server.xml 中配置的方式,侵入性太强,且必须要重启 tomcat 后才可生效。一般也不再建议使用。
根据文档中描述,xml 可位于 /META-INF/context.xml 或 $CATALINA_BASE/conf/[enginename]/[hostname]/ 下。此时 <Context/> 的 path 属性将被忽略,context-path 被自动推断。为了部署 ROOT 应用,依据推断规则,只可在$CATALINA_BASE/conf/[enginename]/[hostname]/ 创建 ROOT.xml 文件。此处具体为 $CATALINA_HOME/conf/Catalina/localhost/ROOT.xml,内容如下:
<Context docBase="/path/not/appBase/myroot" />
注意,此时 myroot 不能部署在默认部署目录(默认为 webapps)下,否则将会被忽略。
第三种方法一般是建议的方式,它即不“简单粗暴”,又不具有强侵入性,也不要求配置变动时,必须重启 tomcat 才能生效。
参考:
评论 / 共 0 条