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选项以激活此服务器版本,并浏览到安装文件夹。

Capture1

应用更改后,下次从Eclipse的windows -> show view子菜单打开servers视图时,新配置的服务器将存在,我们可以启动、停止和向其部署应用程序。

6.2. 在嵌入式Tomcat中部署Web应用程序

要将Web应用程序部署到Tomcat,它必须存在于工作区中。

window -> show view打开servers视图并查找服务器。打开后,只需右键单击配置的服务器,从出现的上下文菜单中选择add deployment

Capture-1-1-2

在出现的New Deployment对话框中,打开project下拉菜单,选择Web项目。

Project组合框下方有一个Deploy Type部分。当选择Exploded Archive(development mode)时,应用程序中的更改将实时同步而无需重新部署。 这是开发期间的最佳选择,因为它非常高效。

Capture-2-1-2

选择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选项。

Capture

在左侧面板中,搜索Tomcat Server。如果不存在,单击菜单中的+号,搜索Tomcat,然后选择Local。在名称字段中,输入Tomcat 7/8(取决于版本)。

Capture-1-2

然后单击Configure…按钮,在Tomcat Home字段中,导航到安装的主位置并选择它。

Capture-2

可选地,可以将Startup页面设置为http://localhost:8080/,并将HTTP port设置为8080;根据需要更改端口。

最后,转到Deployment选项卡,单击+符号,选择要添加到服务器的工件,然后单击OK。

Capture-3-1

7.2. 远程配置

遵循与本地Tomcat配置相同的说明,但在服务器选项卡中,必须输入安装的远程位置。

8. 通过复制归档文件部署

我们已经学习了如何从Eclipse导出WAR。另一种方法是简单地将WAR文件放入任何Tomcat实例的$CATALINA_HOME\webapps目录进行部署。如果实例正在运行,部署将立即开始,因为Tomcat会解压归档文件并配置其上下文路径。

如果实例未运行,则服务器将在下次启动时部署项目。

9. 通过Tomcat Manager部署

假设我们已有WAR文件,并希望使用管理控制台部署它,可以通过访问http://localhost:8080/manager来访问管理控制台。

控制台有五个不同部分:ManagerApplicationsDeployDiagnosticsServer Information

如果转到Deploy部分,会发现两个子部分。

9.1. 部署服务器上的目录或WAR文件

如果WAR文件位于运行Tomcat实例的服务器上,可以填写必需的Context Path字段(前面加正斜杠"/")。

例如,如果我们希望Web应用程序通过URL http://localhost:8080/myapp从浏览器访问,那么上下文路径字段将是/myapp

我们也可以跳过XML Configuration file URL字段,直接转到WARDirectory 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的嵌入式服务器能提供更高效的调试体验。


原始标题:How to Deploy a WAR File to Tomcat