Tomcat的下载从来不引人注目,但是我觉得搞清楚下载这些jar有什么用,对大家是很有好处的,
我们来看一下Tomcat官方提供的几个下载内容,以8.0.32为例:

整体上来分为二进制包下载和源码下载。
1.源码下载
源码下载为上述所有二进制包的源码,内含有编译打包的全部配置文件,源代码文件:

bin:脚本文件,打包之后也是bin目录
conf:对应配置文件
java:tomcat的所有源代码
modules:tomcat的模块,其实就是tomcat默认自带的数据库连接池jdbc-pool的源码
res:tomcat依赖的一些工具支撑,如checkstyle,maven,eclipse-ide支撑的源码等等
test:tomcat的单元测试,这个其实大多数人都非常忽略这个,但是确实窥探tomcat源码的一个入口
webapps:对应的默认的tomcat中的web应用的源码,含有管理控制台等应用
在根目录执行ant ,就可以将对应的tomcat编译到指定的目录中。
值得注意的一说是,在编译前,需要制定tomcat编译出来的目录,见下面的指定:

2.二进制Core下载

核心下载,就是Tomcat的主文件,一共分为几种不同的下载方式,
直接可以解压的:zip格式,tar.gz格式的,直接解压,然后就可以执行
windows不同位数:对于32位和64位这种的,dll文件是不一样的,这些dll文件的作用就是让tomcat可以变成系统服务,

上述的Windows的安装版本都不一样。
3.全部文档下载

这里的全部文档指的不仅仅是 docs 这个已经部署在tomcat中的文档应用,而是比这个应用还要全,
不单单包含User guide等内容,还包括tomcat和JAVA EE的API,也就是docs 应用中不能用的在这个文档中都可以看到。
4.Deployer下载

这个Deployer工具,其实是一个ant的工程,它的作用是利用Tomcat Manager(也就是Manager应用对单机Tomcat的部署管理),
这个Tomcat Manager应用不单单在页面上提供了应用部署等一些接口,可以通过http进行部署,如:

而这个Deployer工具,正式调用这个Tomcat Manager进行部署本地的应用,只不过这里调用的实现是通过ant来做的:

在build.xml中提供了几个ant的命令:

除了应用部署,启动,停止,解部署,重部署之外,还提供了jsp的编译工具(实际也就是调用jsaper的实现,对jsp进行编译)。
执行方式是,在当前根目录中需要定义一个deployer.properties文件,在这个文件中定义下面的key,value的键值对:

这些键值对其实在ant的build.xml文件中也可以进行修改:

5.扩展功能下载

JMX Remote jar:
这个jar是Tomcat提供的JMX的远程接口,可以看看这个jar中的内容:

这个JMX是作为一个lifecycle加载到Tomcat中的,当这个服务开启以后,JMX服务就在服务端开启,
要使用的时候,首先需要加上这个lifecycle:

其次,需要在服务端加上jmx的启动参数:

然后,客户端通过jmx的url字符串,

就可以实现实时管理Tomcat了;
Web services jar:
JSR109的加入,可以让Webservice更好的融入到JAVA EE体系中来,这是一个比较有意思的规范,
从客户端的角度上来看,用户可以通过JNDI去访问发布的webservice:

对于服务器端,也可以通过原注释来引入Webservice服务:

另外,对于EJB,Servlet等原有JAVA EE的组件,这个规范定义了如何将现有的这些组件很容易就可以转变为
Webservice服务,并同步其二者的生命周期,事务等等。
有兴趣可以去 https://www.jcp.org/en/jsr/detail?id=109 看看这个规范的具体的spec。
对于tomcat来说,其提供了JSR109的API的Factory工厂,也就是基础设施,
说白了就是:

当你引入这个catalina-ws.jar包之后,你还需引入webservice的实现,才能按照JSR109规范的用法进行使用,
从jar的源码中也可以看到,其并没有提供webservice的全部实现,仅仅就是一个工厂:

JUL logger jar:
Tomcat中的日志一共可以配置成三种模式:
1.默认的JUL,也就是tomcat基于java,util.logging制作的一款默认的日志输入器
2.Servlet规范定义的日志:

也就是说,可以:

3.上述两种都是默认并且是规范固定的,如果想自定义扩展,tomcat需要提供一种机制,进行切换,

JULI的adapters是提供了一种适配器,例如想插入Log4j,需要下载这个适配器的jar,这个jar包可以自动发现log4j,从源码也可以看出来:

并且需要下载默认的jul的logger的包替换掉原有的tomcat-jul包。
这就是上述两个包的用途,在User Guide的logging中,有非常详细的描述。
6.tomcat嵌入式下载
jetty是非常轻量级的web容器,而tomcat同样可以也可以做,这个下载解压出来的这些jar包,就是一个最精简的Tomcat集合:

使用的时候,也非常简单,但是对于Tomcat的基本运行结构还是不能变的:
<Server>
<Service>
<Connector />
<Engine>
<Host>
<Context 1/>
<Context 2/>
<Context n…/>
</Host>
</Engine>
</Service>
</Server>
导入这些jar包,可以按照下面程序,将Tomcat嵌入进去:
在具体应用时启动嵌入式Tomcat,需要根据以下步骤(主要是参照上面的结构图):
1)创建org.apache.catalina.startup.Embedded实例,其代表嵌入式Tomcat Server的实例;
2)创建org.apache.catalina.Engine 实例,代表上面XML结构示例中的Engine,作为容器用来包含Host节点;
3)创建org.apache.catalina.Host实例,代表虚拟主机服务,把它加入到2)中产生的Engine中去;
4)创建一个或多个org.apache.catalina.Context实例,代表具体Web应用,每个Web应用都需要加入到3)产生的Host中;
5)最后创建org.apache.catalina.Connector实例,把它加入2)创建的Engine中,它用来接收客户发出的请求。
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.startup.Embedded;
public class TomcatService {
private static Embedded tomcat;
public static void main(String[] args) {
// set the path for tomcat embed
String path = "F:/myDaRepository/apache-tomcat-embed";
Embedded tc = createTomcat(path);
try {
tc.start();
System.out.println("Tomcat Server start over");
// tc.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
private static Embedded createTomcat(String path) {
// create Tomcat Server Instance
tomcat = new Embedded();
// set the tomcat home
tomcat.setCatalinaHome(path);
// create the Tomcat engine
Engine engine = tomcat.createEngine();
engine.setName("MyTestServer");
// create the host
Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()
+ "/webapps");
// put the host into engine
engine.addChild(host);
engine.setDefaultHost(host.getName());
String javayouPath = host.getAppBase() + "/CloudscapeDemo";
if (!new File(javayouPath).exists()) {
System.err.println("Please test if the javayou exists");
return null;
}
System.out.println("javayouPath"+javayouPath);
// create the context, and add it to the host
Context ctxtJavayou = tomcat
.createContext("/CloudscapeDemo", javayouPath);
host.addChild(ctxtJavayou);
tomcat.addEngine(engine);
try {
// put the Connector to Tomcat,listen the local visit from 127.0.0.1
tomcat.addConnector(tomcat.createConnector(InetAddress
.getByName("127.0.0.1"), 8080, false));
} catch (UnknownHostException e) {
System.err.println("can not bind tomcat Server to the localhost 127.0.0.1:8080;test the host is free");
e.printStackTrace();
tomcat = null;
}
return tomcat;
}
public void shutdown() throws Exception {
tomcat.stop();
}
}
这是最精简的Tomcat的代码,创建了一个/CloudscapDemo的应用,并配置了一个Connector的localhostde 8080端口
进行了舰艇,你可以直接访问 http://localhost:8080/CloudscapeDemo/xxx.jsp 就可以浏览Tomcat了。




