Tomcat 8.5.35 简介

Kopei article

今天看了一下官网的Tomcat介绍, 特地记录一下相关信息. Tomcat是一个开源的Java Servlet Container, 这个容器提供了一个Java运行的HTTP web的环境.

一个术语

Context: 一个Context就是一个web应用.

Tomcat解压后包含的相关目录和文件

  • /bin 里面的脚本用于启动, 停止, 和其他如设置环境变量的功能. *.shUnix系统, *.batWindows系统.
  • /conf 里面有一些配置文件和DTD(Document Type Definition). 最重要的是Server.xml, 是容器的主要配置文件.
  • /logs log文件
  • /webapps 应用所在处

CATALINA_HOME 和 CATALINA_BASE

CATALINA_HOMEtomcat安装的根目录, CATALINA_BASE代表了一个tomcat实例运行的配置根目录. 如果一台服务器有多个tomcat实例在跑, 可以使用这个参数分别启动不同实例. 总的来说, CATALINA_HOME的位置包含了静态文件如.jar和二进制文件, CATALINA_BASE位置包含了配置文件, 日志, 部署的应用和其他运行所需的依赖.
使用同一个CATALINA_HOME和多个CATALINA_BASE的好处是:

  • 容易更新tomcat, 由于共享CATALINA_HOME.jar文件和二进制文件, 我们可以只用更新一个tomcat, 但是运行多个tomcat实例.
  • 防止重复*.jar文件.
  • 共享一些脚本, 如setenv脚本

RUNNING.txt

RUNNING.txt这个文件包含所有用于在各个平台运行tomcat的信息, 需要仔细看一下.
在Unix安装tomcat的时候, 需要把JAVA_HOME环境变量设置于JDK的基目录.

使用tomcat开发

Servlet API Specification 2.2以后, 公认使用Web Application Archive(WAR)作为网页应用的标准格式. 所以一个打包的web应用是有标准的层级布局的。比如把HTML和JSP页面放在一起作为用户交互, 然后部署的时候管理员给你的应用设置一个context path, 比如catalog/, 那么一个请求到catalog/index.html就会取你项目根目录的index.html文件.

标准的WAR目录结构

打包一个标准的WAR, 一般会在项目中有如下目录结构:

  • html, jsp, etc这些文件是用户可以在客户端访问的文件, 可以在一个文件夹或分成多个目录。
  • /WEB-INF/web.xml这个文件是Web Application Deployment Descriptor, 代表应用部署的描述文件.这个xml文件描述了应用所组成的部分:包括servlet和其他组件; 还有初始化参数和容器级别的安全限制.
  • /WEB-INF/classes/包含了java类文件, 包含所有没有打成jar文件的java文件.如果你的java类以package的形式组织, 那么可以在/WEB-INF/classes/com/...class找到.
  • /WEB-INF/lib/这个目录包含了jar包
    /WEB-INF/lib//WEB-INF/classes/中的所有java类是对整个应用可见的.

共享Library文件

大部分servlet容器如tomcat支持预安装jar文件, 然后使它们可以被web应用可见(不需要被应用引入). $CATALINA_HOME/lib是tomcat安装共享代码的地方. Tomcat使用class loader来定位和共享这些类. 首先, Tomcat会安装java.lang.ClassLoader实现的class loader, 让web应用和容器的组成部分能够访问不同的类和资源. 这个机制实现了Servlet SpecificationV2.4的9.4和9.6章节提出的技术要求.

class loader的大致情况

java环境中, class loader是父子树结构. 通常情况下, 当一个class loader需要加载某个类或者资源时, 它会首先去请求它的父class loader, 如果父class loader不能加载某个类或者资源才会从它自己的仓库查找. 注意, web应用的class loader可能有一点不一样, 但是总体原则类似.

class loader定义

tomcat初始化时会创建如下class loader:

  • Bootstrap. 这个class loader包含了JVM的基本运行类和$JAVA_HOME/jre/lib/ext中的系统扩展jar包.
  • System. 这个class loader初始化所有在CLASSPATH定义的内容. 这个路径中所有的类可以被tomcat内部类和应用看见, 除了tomcat的catalina启动脚本($CATALINA_HOME/bin/catalina.sh).这个启动脚本会忽略CLASSPATH环境变量, 而从这个脚本启动的system class loader将会从如下仓库构建:
    • $CATALINA_HOME/bin/bootstrap.jar, main()函数用于初始化tomcat server和class loader实现类.
    • $CATALINA_BASE/bin/tomcat-juli.jar或者CATALINA_BASE/bin/tomcat-juli.jar. 日志实现类.
    • $CATALINA_HOME/bin/commons-daemon.jar Apache Commons Daemon 项目中的类.
  • Common. 这个class loader包含了所有能让Tomcat内部类和所有应用可见的类. 这个class loader的搜索路径在$CATALINA_BASE/conf/catalina.propeties文件的common.loader属性定义.
    common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
  • Post title:Tomcat 8.5.35 简介
  • Post author:Kopei
  • Create time:2017-11-29 00:00:00
  • Post link:https://kopei.github.io/2017/11/28/java-2017-11-29-tomcat-8-5-35-intro/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments