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. c#通过表达式树优雅的实现分组取TopN笔记

    需要引入nuget包来实现ef.functions调用row_number Thinktecture.EntityFrameworkCore.SqlServer 调用方式: //顺排 context. ...

  2. WPF内嵌Http协议的Server端

    需求:有时后比如WPF,WinForm,Windows服务这些程序可能需要对外提供接口用于第三方服务主动通信,调用推送一些服务或者数据. 想到的部分实现方式: 一.使用Socket/WebSocket ...

  3. C# 使用RabbitMQ消息队列

    参考文章 https://www.cnblogs.com/kiba/p/11703073.html和https://www.cnblogs.com/longlongogo/p/6489574.html ...

  4. SqlSugar多库/多租户

    1. 多库和多租户 如果是接口ISugarClient先看一下标题6,看完在看这儿 1.1 固定多数据库模式 数据库数量是固定的一般在声明的全部加上 //通过ConfigId进行数据库区分 var d ...

  5. C/C++ 实现Socket交互式服务端

    在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,通过 Socket API,开发者可以创建.连接.发送和接收数据,实现网络通信.本文将 ...

  6. 字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 字节码编程插桩这种技术常与 Javaagent 技术结合用在系统的非入侵监控中,这样 ...

  7. C++11之函数对象

    目录 1.使用场景 2.函数对象 3.std::bind 4.总结 1.使用场景 在没有C++11的时候,我们通常使用回调函数来完成某些特定的功能,使用回调函数就需要先声明函数指针 示例: typed ...

  8. C#合成图片显示不全

    现象 前段时间用C#写了一个小工具,主要功能是随机读取图片并合成一张长图.最近在使用的时候发现个问题,原图片宽度是1080,合成后的图片宽度也是1080,但是合成后的图片没有显示全,就像下面这样 原图 ...

  9. MASA学习和总结

    一.MASA概述 MASA是温州数闪科技推出的开源产品,目前有三个产品线,分别是MASA Stack,MASA Framework,MASA Blazor. MASA Stack:是一个开源.企业级. ...

  10. Mysql切割字符串

    我们常常会遇到需要处理字段中字符串的需求,包括切割.拼接以及搜索等等,在这里介绍几个常用的切割字符串的函数,首先我们在表格中加入我们的实验字段值:https://www.cnblogs.com/Yao ...