部署
目录
背景
在描述如何组织源代码目录之前,了解 Web 应用程序的运行时组织很有用。在 Servlet API 规范 2.2 版之前,服务器平台之间几乎没有一致性。但是,符合 2.2(或更高版本)规范的服务器必须接受标准格式的Web 应用程序存档,下面将进一步讨论。
Web 应用程序被定义为标准布局中的目录和文件层次结构。此类层次结构可以以“解压缩”形式访问,其中每个目录和文件都单独存在于文件系统中,或者以称为 Web ARchive 或 WAR 文件的“压缩”形式访问。前一种格式在开发过程中更有用,而后一种格式在分发应用程序进行安装时使用。
Web 应用程序层次结构的顶级目录也是应用程序的文档根目录。在这里,你将放置构成应用程序用户界面的 HTML 文件和 JSP 页面。当系统管理员将应用程序部署到特定服务器时,他们会为你的应用程序分配一个上下文路径(本手册的后面部分介绍了在 Tomcat 上的部署)。因此,如果系统管理员将应用程序分配给上下文路径 /catalog
,那么引用 /catalog/index.html
的请求 URI 将从文档根目录中检索 index.html
文件。
标准目录布局
为了便于创建所需格式的 Web 应用程序存档文件,可以将 Web 应用程序的“可执行”文件(即 Tomcat 在执行应用程序时实际使用的文件)组织成与 WAR 格式本身要求的组织相同。为此,你最终将在应用程序的“文档根目录”中获得以下内容
- *.html、*.jsp 等 - HTML 和 JSP 页面,以及应用程序中客户端浏览器必须可见的其他文件(例如 JavaScript、样式表文件和图像)。在较大的应用程序中,你可以选择将这些文件划分为子目录层次结构,但对于较小的应用程序,通常只需为这些文件维护一个目录即可,这样会简单得多。
- /WEB-INF/web.xml - 应用程序的Web 应用程序部署描述符。这是一个 XML 文件,描述构成应用程序的 servlet 和其他组件,以及你希望服务器为你强制执行的任何初始化参数和容器管理的安全约束。以下小节将更详细地讨论此文件。
- /WEB-INF/classes/ - 此目录包含应用程序所需的任何 Java 类文件(和关联资源),包括 servlet 和非 servlet 类,这些类未合并到 JAR 文件中。如果你的类组织到 Java 包中,则必须在
/WEB-INF/classes/
下的目录层次结构中反映这一点。例如,名为com.mycompany.mypackage.MyServlet
的 Java 类需要存储在名为/WEB-INF/classes/com/mycompany/mypackage/MyServlet.class
的文件中。 - /WEB-INF/lib/ - 此目录包含 JAR 文件,其中包含应用程序所需的 Java 类文件(和关联资源),例如第三方类库或 JDBC 驱动程序。
当你将应用程序安装到 Tomcat(或任何其他 2.2 或更高版本的 Servlet 容器)中时,WEB-INF/classes/
目录中的类以及 WEB-INF/lib/
目录中 JAR 文件中的所有类都对特定 Web 应用程序中的其他类可见。因此,如果你将所有必需的库类包含在这些位置之一(务必检查你使用的任何第三方库的再分发权利的许可证),你将简化 Web 应用程序的安装——无需调整系统类路径(或在服务器中安装全局库文件)。
这些信息大部分摘自 Servlet API 规范第 9 章,版本 2.3,你应该查阅该规范以了解更多详细信息。
共享库文件
与大多数 servlet 容器一样,Tomcat 还支持安装库 JAR 文件(或解包的类)的机制,并使它们对所有已安装的 Web 应用程序可见(无需包含在 Web 应用程序本身中)。Tomcat 如何查找和共享此类类的详细信息在 类加载器操作方法 文档中进行了描述。Tomcat 安装中通常用于共享代码的位置是 $CATALINA_HOME/lib。放置在此处的 JAR 文件对 Web 应用程序和内部 Tomcat 代码都是可见的。这是放置应用程序或内部 Tomcat 使用(例如,DataSourceRealm)所需的 JDBC 驱动程序的好地方。
开箱即用,标准 Tomcat 安装包括各种预安装的共享库文件,包括
- 编写 servlet 和 JSP 的基础 Servlet 6.0 和 JSP 3.1 API。
Web 应用程序部署描述符
如上所述,/WEB-INF/web.xml
文件包含应用程序的 Web 应用程序部署描述符。正如文件名扩展名所暗示的,此文件是一个 XML 文档,它定义了服务器需要了解的有关应用程序的所有内容(除了上下文路径,该路径由系统管理员在部署应用程序时分配)。
部署描述符的完整语法和语义在 Servlet API 规范第 13 章(版本 2.3)中定义。随着时间的推移,预计将提供用于为您创建和编辑部署描述符的开发工具。同时,为了提供一个起点,提供了 基本的 web.xml 文件。此文件包括描述每个包含元素的用途的注释。
注意 - Servlet 规范包括 Web 应用程序部署描述符的文档类型描述符 (DTD),Tomcat 在处理应用程序的 /WEB-INF/web.xml
文件时会强制执行此处定义的规则。特别是,您必须按照 DTD 定义的顺序输入描述符元素(例如 <filter>
、<servlet>
和 <servlet-mapping>
)(请参阅第 13.3 节)。
Tomcat 上下文描述符
/META-INF/context.xml 文件可用于定义特定于 Tomcat 的配置选项,例如访问日志、数据源、会话管理器配置等。此 XML 文件必须包含一个 Context 元素,该元素将被视为与 Web 应用程序所部署到的主机的 Host 元素的子元素。 Tomcat 配置文档 包含有关 Context 元素的信息。
使用 Tomcat 部署
以下描述使用变量名称 $CATALINA_BASE 来引用大多数相对路径相对于其解析的基本目录。如果您尚未通过设置 CATALINA_BASE 目录为 Tomcat 配置多个实例,则 $CATALINA_BASE 将被设置为 $CATALINA_HOME 的值,即您已将 Tomcat 安装到的目录。
为了执行,必须在 servlet 容器上部署 Web 应用程序。即使在开发期间也是如此。我们将描述使用 Tomcat 来提供执行环境。可以通过以下方法之一在 Tomcat 中部署 Web 应用程序
- 将解压的目录层次结构复制到目录
$CATALINA_BASE/webapps/
中的子目录中。Tomcat 将根据您选择的子目录名称为您的应用程序分配一个上下文路径。我们将在构建的build.xml
文件中使用此技术,因为在开发期间这是最快捷、最简单的方法。安装或更新应用程序后,请务必重新启动 Tomcat。 - 将 Web 应用程序存档文件复制到目录
$CATALINA_BASE/webapps/
中。启动 Tomcat 时,它会自动将 Web 应用程序存档文件解压为其解压形式,并以这种方式执行应用程序。此方法通常用于将第三方供应商或内部开发人员提供的附加应用程序安装到现有的 Tomcat 安装中。注意 - 如果您使用此方法,并且希望稍后更新应用程序,则必须同时替换 Web 应用程序存档文件和删除 Tomcat 创建的解压目录,然后重新启动 Tomcat,才能反映您的更改。 - 使用 Tomcat “Manager” Web 应用程序来部署和取消部署 Web 应用程序。Tomcat 包含一个 Web 应用程序,默认部署在上下文路径
/manager
上,它允许您在正在运行的 Tomcat 服务器上部署和取消部署应用程序,而无需重新启动它。有关使用 Manager Web 应用程序的更多信息,请参阅 Manager App 操作指南。 - 在您的构建脚本中使用“Manager”Ant 任务。Tomcat 包含一组针对
Ant
构建工具的自定义任务定义,允许您自动执行对“Manager”Web 应用程序的命令。这些任务在 Tomcat 部署程序中使用。 - 使用 Tomcat 部署程序。Tomcat 包含一个打包工具,该工具捆绑了 Ant 任务,并且可用于在部署到服务器之前自动预编译 JSP,这些 JSP 是 Web 应用程序的一部分。
在其他 servlet 容器上部署您的应用程序将针对每个容器而有所不同,但所有与 Servlet API 规范(2.2 版或更高版本)兼容的容器都必须接受 Web 应用程序归档文件。请注意,其他容器不需要接受未打包的目录结构(如 Tomcat 所做的那样),或提供共享库文件的机制,但这些功能通常可用。