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

Tomcat8.5简介的更多相关文章

  1. nginx之 nginx-1.9.7 + tomcat-8.5.15 反向代理+应用负载均衡 安装配置

    环境说明:nginx 反向代理服务器 ip 为: 10.219.24.26tomcat1 应用服务器 ip 为: 10.219.24.21tomcat3 应用服务器 ip 为: 10.219.24.2 ...

  2. 知识小罐头08(tomcat8启动源码分析 上)

    前面好几篇都说的是一个请求是怎么到servlet中的service方法的,这一篇我们来看看Tomcat8是怎么启动并且初始化其中的组件的? 相信看了前面几篇的小伙伴应该对Tomcat中的各个组件不陌生 ...

  3. solr简介、学习详细过程!(超详细~)

    solr是什么呢? 一.Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. 二.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出 ...

  4. CentOS7.5安装Tomcat8

    一.tomcat的简介 这是Apache Tomcat Servlet / JSP容器的文档包的顶级入口点 .的Apache Tomcat 8.0版实现了Servlet 3.1和JavaServer ...

  5. linux下源码安装jdk1.8和tomcat8.5

    Java是目前可移植性较高的语言,相当火热,tomcat运行就需要Java语言环境 0.java简介 1)tomcat运行需要对应的Java环境,Java环境通过安装jdk来获得2)为了防止兼容性问题 ...

  6. linux下yum安装jdk1.8(rpm包)和tomcat-8.5

    Java是目前可移植性较高的语言,相当火热,tomcat运行就需要Java语言环境 ========= 完美的分割线 ========= 0.java简介 1)tomcat运行需要对应的Java环境, ...

  7. 配置Tomcat && Http简介

    WEB环境搭建 1. Web服务器 Web服务器主要用来接收客户端发送的请求和响应客户端请求. 作为JavaWeb程序来说,还需要有Servet容器,容器的主要作用就是调用java程序处理用户发送的请 ...

  8. Windows环境下设置Tomcat8以服务的形式运行,不再打开Tomcat窗口

    内容简介 在Windows操作系统下,设置Tomcat8以服务的形式运行,按照以下3步来操作即可.前提条件:已安装好Java环境,并配置好java的环境变量:已下载好Tomcat8并解压到某目录. s ...

  9. 配置Tomcat-8.5 JVM内存参数

    配置Tomcat-8.5 JVM内存参数 apache-tomcat-8.5与之前的版本存在些许差异,配置方式有所改变,并且针对JVM一些参数不再支持.故本文档主要简介一下如何在apache-tomc ...

  10. 01 . Tomcat简介及部署

    Tomcat简介 Tomcat背景 tomcat就是常用的的中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中.而tomcat本 ...

随机推荐

  1. 关于 const

    const 限定符 在编译器中限制变量,设定该变量不可被改变,但实际上系统里还是将由 const 修饰的值识别为一个变量(只是在编译器中进行限制) 注意: 由 const 修饰的变量必须在定义时就进行 ...

  2. vim 从嫌弃到依赖(10)——缓冲区列表

    之前的一系列文章主要介绍了vim文本相关的操作,并且也介绍了vim的几种模式.通过前面的内容,相信各位小伙伴们已经对vim有了一个基本的了解,同时也能够使用vim快速编辑文本,从这篇开始,我们将要介绍 ...

  3. @RequestBody中使用@DateTimeFormat报错:JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException

    原因分析 根据异常提示:不匹配输入异常,指输入的参数错误,说是只支持String类型和Array数组类型的. @PostMapping("/test") public Dto ge ...

  4. 强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

    强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C.与生成对抗网络的联系等详解 1.核心词汇 优势演员-评论员(a ...

  5. 强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战

    强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa.Qlearning:蒙特卡洛策略.时序差分等以及Qlearning项目实战 策略最简单的表示是查找表(look-up table),即表 ...

  6. 1.14 手工插入ShellCode反弹

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  7. C#/.NET/.NET Core优秀项目和框架2024年1月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...

  8. 手撕Udp套接字|实现群聊通信|实现Windows & Linux通信交互

    ​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482UdpSocke ...

  9. C++小项目|2022期末大作业

    前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm=1001.2014. ...

  10. P9993 [Ynoi Easy Round 2024] TEST_133 题解

    题目链接: [Ynoi Easy Round 2024] TEST_133 首先历史最大加,吉司机跑不掉了,维护历史最大加标记以及历史最大,那么根据吉司机标记思想更新操作应该为 \[new \Left ...