1. 概述
Apache Tomcat是Java社区中最流行的Web服务器之一。它作为Servlet容器运行,能够部署扩展名为WAR的Web应用程序。
它提供了一个管理控制台,通过这个控制台,我们可以部署新的Web应用程序或卸载现有的应用程序,而无需重启容器。这在生产环境中特别有用。
本教程将简要介绍Tomcat,然后详细介绍部署WAR文件的多种方法。
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
目录下,它将通过URL http://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的管理控制台。要访问此控制台,必须配置一个具有适当角色的管理员用户。
要访问控制台,管理员用户需要manager-gui
角色。稍后,我们将使用Maven部署WAR文件,为此还需要manager-script
角色。
在$CATALINA_HOME\conf\tomcat-users
中进行这些更改:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<username="admin" password="password" roles="manager-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 port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
例如,如果要将端口更改为8081
,需要修改连接器的port属性:
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" />
有时,所选端口默认未开放。这种情况下,需要在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>
<id>TomcatServer</id>
<username>admin</username>
<password>password</password>
</server>
现在需要从Maven创建一个基本的Web应用程序来测试部署。导航到要创建应用程序的位置。
在控制台运行以下命令创建新的Java Web应用程序:
mvn archetype:generate -DgroupId=com.baeldung -DartifactId=tomcat-war-deployment
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
这将在tomcat-war-deployment
目录中创建一个完整的Web应用程序,如果现在部署并通过浏览器访问,将打印"hello world!"。
但在部署之前,需要做一项更改以启用Maven部署。打开pom.xml
并添加此插件:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<server>TomcatServer</server>
<path>/myapp</path>
</configuration>
</plugin>
注意:我们使用Tomcat 7插件,因为它无需特殊更改即可同时支持版本7和8。
配置中的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 -DgroupId=com.baeldung -DartifactId=cargo-deploy
-DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
这将在cargo-deploy
目录中创建一个完整的Java Web应用程序。如果按原样构建、部署并加载此应用程序,它将在浏览器中打印"Hello World!"。
与Tomcat7 Maven插件不同,Cargo Maven插件要求此文件存在。
由于我们的Web应用程序不包含任何Servlet,web.xml
文件将非常基础。导航到新创建项目的WEB-INF
文件夹,并创建包含以下内容的web.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>cargo-deploy</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
为了使Maven能够识别Cargo的命令而无需输入完全限定名称,需要将Cargo Maven插件添加到Maven的settings.xml
中的插件组。
作为根元素<settings></settings>
的直接子元素,添加:
<pluginGroups>
<pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>
5.2. 本地部署
在本小节中,我们将编辑pom.xml
以适应新的部署需求。
添加此插件:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.5.0</version>
<configuration>
<container>
<containerId>tomcat7x</containerId>
<type>installed</type>
<home>插入Tomcat 7安装的绝对路径</home>
</container>
<configuration>
<type>existing</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.x,cargo maven2插件都适用。
现在可以通过执行以下命令安装应用程序:
mvn install
然后部署它:
mvn cargo:deploy
如果一切顺利,我们应该能够通过加载http://localhost:8080/cargo-deploy
来运行Web应用程序。
5.3. 远程部署
要进行远程部署,只需更改pom.xml
的配置部分。远程部署意味着我们没有本地Tomcat安装,但可以访问远程服务器上的管理控制台。
让我们更改pom.xml
,使配置部分如下所示:
<configuration>
<container>
<containerId>tomcat8x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.remote.username>admin</cargo.remote.username>
<cargo.remote.password>admin</cargo.remote.password>
<cargo.tomcat.manager.url>http://localhost:8080/manager/text
</cargo.tomcat.manager.url>
</properties>
</configuration>
</configuration>
这次,我们将容器类型从installed
更改为remote
,配置类型从existing
更改为runtime
。最后,向配置添加身份验证和远程URL属性。
确保角色和用户已存在于$CATALINA_HOME/conf/tomcat-users.xml
中,与之前一样。
如果正在为remote
部署编辑同一项目,首先卸载现有的WAR:
mvn 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配置相同的说明,但在服务器选项卡中,必须输入安装的远程位置。
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应用程序通过URL http://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的嵌入式服务器能提供更高效的调试体验。