
1. 概述Apache Tomcat是Java社区中最流行的Web服务器之一。它作为Servlet容器运行能够部署扩展名为WAR的Web应用程序。它提供了一个管理控制台通过这个控制台我们可以部署新的Web应用程序或卸载现有的应用程序而无需重启容器。这在生产环境中特别有用。本教程将简要介绍Tomcat然后详细介绍部署WAR文件的多种方法。进一步阅读将 Spring Boot 项目打包为 WAR 部署到 TomcatSpring Boot 是一个“约定优于配置”的框架能快速搭建生产就绪的 Spring 应用。而 Tomcat 作为最主流的 Java Servlet 容器之一广泛用于企业级部署环境。Java编程语言更多 →Apache Tomcat入门介绍简单来说Apache Tomcat 是一个用于部署和提供Java Web应用的Web服务器和Servlet容器。更多 →修改 Tomcat HTTP 端口为 80 的实践指南默认情况下Apache Tomcat 运行在 8080 端口。实际开发中常遇到两种情况更多 →2. Tomcat结构在开始之前我们需要熟悉一些术语和环境变量。2.1. 环境变量如果你之前使用过Tomcat这些变量应该很熟悉。计算机服务器这个变量指向服务器安装的目录$CATALINA_HOME复制这个变量指向特定Tomcat实例的目录我们可能安装了多个实例$CATALINA_BASE复制如果未显式设置此变量它将被赋予与$CATALINA_HOME相同的值。Web应用程序部署在$CATALINA_HOME\webapps目录下。2.2. 术语文档根目录Document root– 指的是Web应用程序的顶级目录所有应用程序资源如JSP文件、HTML页面、Java类和图像都位于此处。上下文路径Context path– 指的是相对于服务器地址的位置表示Web应用程序的名称。例如如果我们的Web应用程序放在$CATALINA_HOME\webapps\myapp目录下它将通过URLhttp://localhost/myapp访问其上下文路径为/myapp。WAR– Web Archive的缩写。它是一种以ZIP格式打包Web应用程序目录层次结构的文件扩展名。Java Web应用程序通常打包为WAR文件进行部署。这些文件可以通过命令行或IDE如Eclipse创建。开发工具部署WAR文件后Tomcat会将其解包并将webapps目录中的所有项目文件存储在一个以项目命名的新目录中。3. Tomcat设置Tomcat Web服务器是免费软件可以从其官网下载。要求用户的机器上安装了JDK并且正确设置了JAVA_HOME环境变量。3.1. 启动Tomcat我们可以通过运行位于$CATALINA_HOME\bin\startup的启动脚本来启动Tomcat服务器。每个安装包中都包含.bat和.sh文件。根据我们使用的是Windows还是Unix操作系统选择相应的脚本执行。3.2. 配置角色在部署阶段我们有多种选择其中之一是使用Tomcat的管理控制台。要访问此控制台必须配置一个具有适当角色的管理员用户。Java编程语言要访问控制台管理员用户需要manager-gui角色。稍后我们将使用Maven部署WAR文件为此还需要manager-script角色。在$CATALINA_HOME\conf\tomcat-users中进行这些更改role rolenamemanager-gui/ role rolenamemanager-script/ usernameadmin passwordpassword rolesmanager-gui, manager-script/复制有关不同Tomcat角色的更多详细信息请参阅官方链接。3.3. 设置目录权限最后确保Tomcat安装目录具有读/写权限。3.4. 测试安装要测试Tomcat是否正确设置运行启动脚本startup.bat/startup.sh。如果控制台没有显示错误我们可以通过访问http://localhost:8080来再次确认。计算机服务器如果看到Tomcat的欢迎页面说明服务器已正确安装。3.5. 解决端口冲突默认情况下Tomcat设置为监听端口8080上的连接。如果已有其他应用程序绑定到此端口启动控制台会提示我们。要更改端口可以编辑位于$CATALINA_HOME\conf\server.xml的服务器配置文件。默认的连接器配置是Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /复制例如如果要将端口更改为8081需要修改连接器的port属性Connector port8081 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /复制有时所选端口默认未开放。这种情况下需要在Unix内核中使用适当命令打开端口或在Windows中创建相应的防火墙规则。由于超出本文范围此处不再赘述。软件4. 通过Maven部署如果要使用Maven部署Web应用程序必须在Maven的settings.xml文件中将Tomcat配置为服务器。settings.xml文件可能位于两个位置Maven安装目录${maven.home}/conf/settings.xml用户安装目录${user.home}/.m2/settings.xml找到文件后添加Tomcat配置server idTomcatServer/id usernameadmin/username passwordpassword/password /server复制现在需要从Maven创建一个基本的Web应用程序来测试部署。导航到要创建应用程序的位置。开发工具在控制台运行以下命令创建新的Java Web应用程序mvn archetype:generate -DgroupIdcom.baeldung -DartifactIdtomcat-war-deployment -DarchetypeArtifactIdmaven-archetype-webapp -DinteractiveModefalse复制这将在tomcat-war-deployment目录中创建一个完整的Web应用程序如果现在部署并通过浏览器访问将打印hello world!。但在部署之前需要做一项更改以启用Maven部署。打开pom.xml并添加此插件plugin groupIdorg.apache.tomcat.maven/groupId artifactIdtomcat7-maven-plugin/artifactId version2.2/version configuration urlhttp://localhost:8080/manager/text/url serverTomcatServer/server path/myapp/path /configuration /plugin复制注意我们使用Tomcat 7插件因为它无需特殊更改即可同时支持版本7和8。Java编程语言配置中的url是我们发送部署请求的地址Tomcat会知道如何处理。server元素是Maven识别的服务器实例名称。最后path元素定义我们部署的上下文路径。这意味着如果部署成功我们将通过访问http://localhost:8080/myapp来使用Web应用程序。现在可以从Maven运行以下命令部署Web应用程序mvn tomcat7:deploy复制卸载它mvn tomcat7:undeploy复制最后在更改后重新部署mvn tomcat7:redeploy复制5. 使用Cargo插件部署Cargo是一个多功能库允许我们以标准化方式操作各种类型的应用程序容器。5.1. Cargo部署设置本节将学习如何使用Cargo的Maven插件将WAR部署到Tomcat。这里我们将部署到Tomcat 7实例。计算机服务器为了全面理解整个过程我们将从零开始通过命令行创建一个新的Java Web应用程序mvn archetype:generate -DgroupIdcom.baeldung -DartifactIdcargo-deploy -DarchetypeArtifactIdmaven-archetype-webapp -DinteractiveModefalse复制这将在cargo-deploy目录中创建一个完整的Java Web应用程序。如果按原样构建、部署并加载此应用程序它将在浏览器中打印Hello World!。与Tomcat7 Maven插件不同Cargo Maven插件要求此文件存在。由于我们的Web应用程序不包含任何Servletweb.xml文件将非常基础。导航到新创建项目的WEB-INF文件夹并创建包含以下内容的web.xml文件?xml version1.0 encodingUTF-8? web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://java.sun.com/xml/ns/javaee xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd idWebApp_ID version3.0 display-namecargo-deploy/display-name welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list /web-app复制为了使Maven能够识别Cargo的命令而无需输入完全限定名称需要将Cargo Maven插件添加到Maven的settings.xml中的插件组。软件作为根元素settings/settings的直接子元素添加pluginGroups pluginGrouporg.codehaus.cargo/pluginGroup /pluginGroups复制5.2. 本地部署在本小节中我们将编辑pom.xml以适应新的部署需求。添加此插件build plugins plugin groupIdorg.codehaus.cargo/groupId artifactIdcargo-maven2-plugin/artifactId version1.5.0/version configuration container containerIdtomcat7x/containerId typeinstalled/type home插入Tomcat 7安装的绝对路径/home /container configuration typeexisting/type home插入Tomcat 7安装的绝对路径/home /configuration /configuration /plugin /plugins /build复制撰写本文时的最新版本是1.5.0。但最新版本始终可以在此处找到。注意我们显式定义了打包类型为WAR没有这个构建将失败。在插件部分我们添加了cargo maven2插件。此外我们添加了一个配置部分告诉Maven我们正在使用Tomcat容器以及一个现有安装。开发工具通过将容器类型设置为installed我们告诉Maven机器上已安装一个实例并提供此安装的绝对URL。通过将配置类型设置为existing我们告诉Tomcat我们正在使用一个现有设置无需进一步配置。另一种方法是告诉cargo通过提供URL下载并设置指定版本。但我们的重点是WAR部署。值得注意的是无论使用Maven 2.x还是Maven 3.xcargo maven2插件都适用。现在可以通过执行以下命令安装应用程序mvn install复制然后部署它mvn cargo:deploy复制如果一切顺利我们应该能够通过加载http://localhost:8080/cargo-deploy来运行Web应用程序。5.3. 远程部署要进行远程部署只需更改pom.xml的配置部分。远程部署意味着我们没有本地Tomcat安装但可以访问远程服务器上的管理控制台。Java编程语言让我们更改pom.xml使配置部分如下所示configuration container containerIdtomcat8x/containerId typeremote/type /container configuration typeruntime/type properties cargo.remote.usernameadmin/cargo.remote.username cargo.remote.passwordadmin/cargo.remote.password cargo.tomcat.manager.urlhttp://localhost:8080/manager/text /cargo.tomcat.manager.url /properties /configuration /configuration复制这次我们将容器类型从installed更改为remote配置类型从existing更改为runtime。最后向配置添加身份验证和远程URL属性。确保角色和用户已存在于$CATALINA_HOME/conf/tomcat-users.xml中与之前一样。软件如果正在为remote部署编辑同一项目首先卸载现有的WARmvn cargo:undeploy复制然后清理项目mvn clean复制接着安装它mvn install复制最后部署它mvn cargo:deploy复制6. 通过Eclipse部署Eclipse允许我们嵌入服务器以便在正常工作流中添加Web项目部署而无需离开IDE。6.1. 在Eclipse中嵌入Tomcat要将安装嵌入Eclipse从任务栏选择window菜单项然后从下拉菜单中选择preferences。在出现窗口的左侧面板中我们将看到一个树状的首选项项网格。接下来导航到eclipse - servers或直接在搜索栏中输入servers。然后可以选择安装目录如果尚未打开并选择下载的Tomcat版本。开发工具在面板的右侧将出现一个配置页面。这里我们选择Enable选项以激活此服务器版本并浏览到安装文件夹。应用更改后下次从Eclipse的windows - show view子菜单打开servers视图时新配置的服务器将存在我们可以启动、停止和向其部署应用程序。6.2. 在嵌入式Tomcat中部署Web应用程序要将Web应用程序部署到Tomcat它必须存在于工作区中。从window - show view打开servers视图并查找服务器。打开后只需右键单击配置的服务器从出现的上下文菜单中选择add deployment。在出现的New Deployment对话框中打开project下拉菜单选择Web项目。在Project组合框下方有一个Deploy Type部分。当选择Exploded Archive(development mode)时应用程序中的更改将实时同步而无需重新部署。这是开发期间的最佳选择因为它非常高效。计算机服务器选择Packaged Archive(production mode)将要求我们每次更改后重新部署才能在浏览器中看到效果。这仅适用于生产环境但Eclipse同样使其变得简单。6.3. 在外部位置部署Web应用程序我们通常选择通过Eclipse部署WAR以简化调试。然而有时我们可能希望将其部署到Eclipse嵌入式服务器使用的位置之外。最常见的情况是生产服务器在线我们需要更新Web应用程序。我们可以通过在生产模式下部署注意New Deployment对话框中的Deploy Location然后从中获取WAR文件来绕过此过程。部署时不从嵌入式服务器中选择而是从servers视图中选择Externally Launched选项位于嵌入式服务器列表旁边。然后导航到外部Tomcat安装的webapps目录。7. 通过IntelliJ IDEA部署要将Web应用程序部署到Tomcat它必须存在并且已经下载安装。软件7.1. 本地配置打开Run菜单单击Edit Configurations选项。在左侧面板中搜索Tomcat Server。如果不存在单击菜单中的号搜索Tomcat然后选择Local。在名称字段中输入Tomcat 7/8取决于版本。然后单击Configure…按钮在Tomcat Home字段中导航到安装的主位置并选择它。可选地可以将Startup页面设置为http://localhost:8080/并将HTTP port设置为8080根据需要更改端口。最后转到Deployment选项卡单击符号选择要添加到服务器的工件然后单击OK。7.2. 远程配置遵循与本地Tomcat配置相同的说明但在服务器选项卡中必须输入安装的远程位置。Java编程语言8. 通过复制归档文件部署我们已经学习了如何从Eclipse导出WAR。另一种方法是简单地将WAR文件放入任何Tomcat实例的$CATALINA_HOME\webapps目录进行部署。如果实例正在运行部署将立即开始因为Tomcat会解压归档文件并配置其上下文路径。如果实例未运行则服务器将在下次启动时部署项目。9. 通过Tomcat Manager部署假设我们已有WAR文件并希望使用管理控制台部署它可以通过访问http://localhost:8080/manager来访问管理控制台。开发工具控制台有五个不同部分Manager、Applications、Deploy、Diagnostics和Server Information。如果转到Deploy部分会发现两个子部分。9.1. 部署服务器上的目录或WAR文件如果WAR文件位于运行Tomcat实例的服务器上可以填写必需的Context Path字段前面加正斜杠/。例如如果我们希望Web应用程序通过URLhttp://localhost:8080/myapp从浏览器访问那么上下文路径字段将是/myapp。我们也可以跳过XML Configuration file URL字段直接转到WAR或Directory URL字段。这里输入Web归档文件在服务器上的绝对URL。例如如果文件位置是C:/apps/myapp.war则输入此位置。重要的是不要忘记WAR扩展名。之后单击deploy按钮。页面将重新加载我们应该在页面顶部看到此消息OK - Deployed application at context path /myapp复制我们的应用程序也应该出现在页面的Applications部分。9.2. 要部署的WAR文件这里只需单击choose file按钮导航到WAR文件的位置选择它然后单击deploy按钮。在两种情况下如果一切顺利Tomcat控制台将通知我们部署成功并显示以下消息计算机服务器INFO: Deployment of web application archive \path\to\deployed_war has finished in 4,833 ms复制10. 结论本文重点介绍了如何将WAR部署到Tomcat服务器。我们涵盖了多种方法包括通过Maven部署使用Cargo插件在Eclipse中部署在IntelliJ IDEA中部署直接复制WAR文件通过Tomcat管理控制台部署每种方法都有其适用场景选择取决于你的工作流程和环境。对于生产环境推荐使用管理控制台或Maven/Cargo插件实现自动化部署开发过程中IDE的嵌入式服务器能提供更高效的调试体验。