Tomcat8.5简介

发布时间 2023-05-23 08:09:50作者: 风吹草

1. Tomcat简介[1]

Apache Tomcat是Servlet/JSP的容器。Tomcat8.5 实现了由 JCP 组织 (Java Community Process) 制定的Servlet3.1 规范[2]和 JSP2.3 (JavaServer Pages2.3) [3]规范,并包含很多额外的功能,是开发和部署web应用程序和web服务的有用平台。

2. 一个简单的webapp应用

2.1 简介

​下面简单介绍使用Tomcat的基本步骤:安装和配置开发环境、按目录组织源代码以及构建和测试应用。主要介绍在不使用IDE,只使用文本编辑器和命令行工具时,如何开发调试应用。介绍的方法是通用的,你可以很容易将它们用在Windows和Unix开发环境下。如果你使用IDE工具,需要将下面的方法和建议进行转换,以在使用IDE工具时适用。

2.2 环境安装
2.2.1 JDK

Tomcat8.5需要运行Java 7或更新的版本上。你可以在官方上下载适用于不同平台的JDK。

2.2.2 Tomcat

在官网上下载Tomcat8.5。

2.2.3 Ant

​你可以在官网[4]上下载Ant构建工具。下载的Ant版本应与其它的软件的版本兼容。我下载的是源码包 apache-ant-1.10.13-src.tar.gz 。Ant的使用可参考官方文档。Ant的源码用java写的,源码包下载好后,需要先运行安装目录下的build.bat,运行后会生成“\apache-ant-1.10.13\bootstrap”目录。然后,运行“\apache-ant-1.10.13\bootstrap\bin\ant.bat”即可进行项目构建。项目构建的配置在build.xml文件中,比如可将项目构建分为编译、打包、部署等步骤。

如果你想在shell窗口中直接使用ant命令,需要将ant的安装目录下的\bootstrap\bin\目录配置在系统环境变量PATH中。

2.2.4 Maven

Maven是Yiddish语(犹太人的语言),意为知识的积累者,起源于人们对简化一个java项目构建的尝试。这个项目包含几个工程,每个工程有独立的Ant构建文件,每个构建文件略有不同。该项目使用CVS进行版本控制。我们希望有一个标准方式去构建这个项目,一个清晰的对项目内容的定义,一个简单地发布项目的方式,一个轻松地在几个项目间共享jar包的方式[5]

这使得Maven诞生了,它可以用于构建和管理所有java项目。我们希望java开发者的日常工作更简单,对java项目有更好的理解。Maven帮助开发者在更短时间内掌握项目开发的完整状态。

​在官网下载Maven的安装包,我下载的是apache-maven-3.8.8。如果你想在shell中直接使用mvn命令,需要将Maven的安装目录下的bin目录配置在系统环境变量PATH中。Maven使得构建项目变得更简单[10]。你只需要按照Maven对源代码目录层级结构要求创建项目,Maven对源代码目录的层级结构要求如图1。创建Maven项目后,既可以使用mvn compile等命令对项目进行编译(compile)、打包(package)、部署(deploy)等。默认情况下maven使用老版本的maven-compiler-plugin插件进行编译,它与java9及以后版本不兼容;如果你使用java9及以上,你需要在pom进行配置,使用maven-compiler-plugin的3.6.0以上版本,如图2所示。

my-app
|-- pom.xml
|-- src
    |-- main
       `|-- java
           `-- com
               `-- mycompany
                   `-- app
                       `-- App.java
        |-- webapp
             -- WEB-INF
                -- web.xml
             -- index.jsp
    |-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

图1 Maven对源代码目录的要求

    <properties>
        <maven.compiler.release>11</maven.compiler.release>
    </properties>
 
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

图2 在pom进行配置,使用maven-compiler-plugin的3.6.0以上版本(默认使用老版本)

如果你在pom.xml配置了依赖,在mvn compile的时候会将依赖下载到指定的mvn仓库中,mvn仓库应在maven安装目录下/conf/setting.xml中进行配置,如果未配置,maven仓库的默认目录是“C:\Users\用户名\.m2\repository”。

如果pom.xml中引用的依赖包在编译的时候被使用,那么这些jar包在mvn package时会被打包到war包的/WEB-INF/lib目录下。

图3 执行mvn compile时被引用的jar包会被打包进/WEB-INF/lib目录下

2.2.5 Git

除了上面的工具以外,强烈建议下载安装源码控制系统,比如Git、Subversion和CVS等。通过这些工具检出源码,提交修改代码;你需要安装服务端软件或者向云提供商申请账户。我本地安装的是git version 2.13.0。如果你想在shell中直接使用git命令,需要将git的安装目录下的bin目录配置在系统环境变量PATH中。

2.3 部署文件目录[6]

在介绍源码目录前,先检查web应用的运行时目录是很有必要的。运行时目录在servlet2.2以前不同的web服务器下通常是不同的;在servlet2.2及以后版本规定了Web应用发布物(archive)的标准格式。Web发布物可以是war文件(tomcat会自动解压),也可以是解压后的文件;但项目文件的目录必须满足规定的层级结构。

​当应用部署到tomcat后,tomcat为应用分配context路径(context path)。context路径是可以进行配置的(可在/conf/server.xml中配置),如果你未配置,则tomcat自动分配一个与发布物文件同名的context路径。context路径是项目的根目录。根目录下项目的结构要求如图4。

context path
	|--*.html,*.jsp等			
	|--WEB-INF						
		|--web.xml			应用部署描述文件			
		|--classes						
		|--lib				包含项目使用的jar包

图4 servlet规范定义的部署文件目录

​web.xml是应用部署的描述文件,它定义了服务器需要知道的关于应用的除context path外的所有配置。它描述了组成应用的sevlet和其它组件,应用的启动参数以及容器管理的安全性(比如session超时时间配置)。servet 2.3的API规范中定义了web.xml文件的格式,有一个基础的web.xml可供参考[7]。一些开发工具为自动为用户创建web.xml文件。

2.4 源文件目录[8]

源文件目录可以是随意的。但我们建议如图5。强烈建议将源文件目录和部署文件目录区分开,这便于对源文件的管理,包括文件复制、执行应用打包等。源文件目录中的dist文件夹应是独立的,不要放在源代码的文件夹(比如src和web)下。如果你使用Maven工具,源文件目录应按照Maven的要求来(详见2.2.4)节,Maven对目录的要求与官方建议的目录有所不同,但是也是满足官方所表述的原则的。

project path
	|--docs	
	|--src		
	|--web
        --WEB-INF						
	|--dist		默认ant dist命令的目标路径,存放应用的发布物等

图5 tomcat建议的源文件目录

2.5 项目编译、打包、部署

在这里介绍使用ant对项目进行编译、打包和部署等。使用MAVEN工具进行这些操作是更简单的(详见2.2.4节),但使用ant可以更好的了解编译、打包和部署是怎么回事。

​项目编译是将源文件目录中的文件,使用java的javac命令将java文件编译为class文件,并存放到部署文件目录的指定文件夹下,同时将源文件目录中的其他文件复制到部署文件目录中。

项目打包是将部署文件目录下的文件,使用java的jar命令将源文件打包为jar(可被其他项目引用的文件)或war(可在tomcat上部署的文件)文件。

​项目部署是将打包好的war文件,通过tomcat的部署界面或URL接口;上传到tomcat的应用目录下。Tomcat也是有部署界面[9]的,只是不像Weblogic的部署界面那样常用。Tomcat部署界面的地址是http://localhost:8080/manager/html。进入该界面是需要登录的,你需要在$CATALINA_BASE/conf/tomcat-users.xml对用户进行配置,比如我添加了如下一行配置。添加后重新启动tomcat,即可使用添加的用户名密码登录部署界面,部署界面如图6。

<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,admin-gui,admin-script"/>

Demo1 Tomcat部署界面用户名密码配置

图6 Tomcat的部署界面

你也可以使用URL接口http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo进行项目的远程部署。

​Ant工具基于上面的编译、打包和部署的过程,通过build.xml脚本对项目编译、打包和部署的过程进行配置。基本的build.xml的格式如Demo2。对编译、打包的配置是直接的,只需要按格式配置源路径、目标路径以及要编译或打包的内容就可以了。为了使用tomcat的自定义任务进行项目的部署,你需要在build.xml中引入(Demo2中的import标签)tomcat的配置文件[9]

<project name="My Application" default="compile" basedir=".">

  <!-- Configure the directory into which the web application is built -->
  <property name="build"    value="${basedir}/build"/>

  <!-- Configure the context path for this application -->
  <property name="path"     value="/myapp"/>

  <!-- Configure properties to access the Manager application -->
  <property name="url"      value="http://localhost:8080/manager/text"/>
  <property name="username" value="myusername"/>
  <property name="password" value="mypassword"/>

  <!-- Configure the path to the Tomcat installation -->
  <property name="catalina.home" value="/usr/local/apache-tomcat"/>

  <!-- Configure the custom Ant tasks for the Manager application -->
  <import file="${catalina.home}/bin/catalina-tasks.xml"/>

  <!-- Executable Targets -->
  <target name="compile" description="Compile web application">
    <!-- ... construct web application in ${build} subdirectory -->
  </target>
    
    <!-- Executable Targets -->
  <target name="dist" description="Package web application">
    <!-- ...package the web application in ${build} subdirectory to a ${path}.war ... -->
  </target>

  <target name="deploy" description="Install web application"
          depends="compile">
    <deploy url="${url}" username="${username}" password="${password}"
            path="${path}" war="file:${build}${path}.war"/>
  </target>

  <target name="reload" description="Reload web application"
          depends="compile">
    <reload  url="${url}" username="${username}" password="${password}"
            path="${path}"/>
  </target>

  <target name="undeploy" description="Remove web application">
    <undeploy url="${url}" username="${username}" password="${password}"
            path="${path}"/>
  </target>

</project>

Demo2 Ant的build.xml的基本配置

在了解了项目编译、打包和部署的过程后,为了简化这些过程,后面使用MAVEN替换ant对项目进行管理。在MAVEN中编译、打包通常是不需要任何配置的(详见2.2.4),部署只需要配置部署的路径即可。MAVEN的pom.xml文件中远程部署的配置如Demo3所示[11]

<!-- 发布到远程仓库的配置 -->
	<distributionManagement>
		<repository>
			<id>my-releases</id>
			<url>http://artifactory.test.com:80/artifactory/myapp/</url>
		</repository>
		<snapshotRepository>
			<id>my-snapshots</id>
			<url>http://artifactory.test.com:80/artifactory/myapp/</url>
		</snapshotRepository>
	</distributionManagement>

Demo3 在Maven的pom.xml中配置远程部署路径

3. 基于Idea工具搭建tomcat项目与热部署

​但基于IDE开发是更快捷的。Idea中代码的联想,与maven、tomcat、jdk和git等工具的整合以及热部署使得开发更简单高效。所以后来将项目迁移到了Idea2021工具上进行开发。

​在Idea上配置Tomcat的热部署是简单的,只需进行如图7的配置即可。配置的含义是当我们修改源代码,比如java文件或jsp文件时,idea会自动编译java文件并将生成的class文件和jsp文件更新到tomcat应用的目录中。如果Tomcat的server.xml文件中host的autodeploy配置为true,当tomcat应用目录(webapps/应用名)下应用的文件有改动时,Tomcat会自动重新部署该应用。也就是说,在应用的源代码文件改动后,idea会重新编译这些文件并放到Tomcat的应用目录下,Tomcat会重新部署这个应用[9]。这里的热部署不适用与Springboot项目,因为Springboot是内置了tomcat的。

图7 Idea上基于Tomcat开启项目的热部署

参考资料:

[1] https://tomcat.apache.org/tomcat-8.5-doc/index.html

[2] https://jcp.org/aboutJava/communityprocess/final/jsr340/index.html

[3] https://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html

[4] https://ant.apache.org/

[5] https://maven.apache.org/what-is-maven.html

[6] https://tomcat.apache.org/tomcat-8.5-doc/appdev/deployment.html

[7] https://tomcat.apache.org/tomcat-8.5-doc/appdev/web.xml.txt

[8] https://tomcat.apache.org/tomcat-8.5-doc/appdev/source.html

[9] https://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html

[10] https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

[11] https://maven.apache.org/guides/getting-started/index.html#how-do-i-deploy-my-jar-in-my-remote-repository