mini Tomcat,朋友,要不要试试?

前面几篇文章,我们基本都是在分析Tomcat内部的一些组件,实现原理等。而一般的Web应用,都需要在开发完成后以目录或者War包的形式,部署到Tomcat中,查看运行结果。

这样其实也没有什么不好,但在有些场景下,我们可能需要特殊的实现形式。

比如:

  • 在Tomcat中做了一些特定的配置,比如端口,比如工作目录,甚至通道的传输编码等。这个时候,如果我们直接将应用发给用户时,由于编码等一些原因可能导致演示等结果不理想。

  • 在做一些Demo演示,甚至开源的项目时,经常会提供一些showcase等quickstart的功能。对于有些习惯了开箱即用的用户,再去单独下载Tomcat,再按照用户手册配置,就稍显冗余且复杂。

其实,Tomcat一直对外提供一种可以嵌入(Embeded)使用的mini Tomcat。

在Tomcat7开始,这种实现形式更加容易。同时,还提供了maven的插件,直接以一条maven的命令就可以完成应用的部署,启动,再不需要单独的配置等,满足用户的开箱即用。

用户所需要做的,只是在maven项目的pom.xml中,增加如下配置:


之后,执行命令mvn tomcat7:run 即可实现应用的启动部署。打开浏览器即可查看。

是不是很容易?

这一maven plugin实现的基础,正是我们上面提到的mini Tomcat,官方称之为Embeded Tomcat。

完整的Tomcat内部,在启动的时候,需要解析其server.xml文件,获取内部配置的各类组件等,而plugin中使用了一系列预定义的配置项,如果需要修改,可以通过命令行参数或者maven中增加配置项来修改

tomcat内部,是通过哪种方式实现的呢?

通过堆栈调用,我们来看下:


在mvn tomcat7:run命令执行时,是从maven的插件Mojo来执行,引导到Tomcat内部。从上面的调用链看,在AbstractRunMojo之后,调用了

org.apache.catalina.startup.Tomcat这个类。一切所谓的嵌入式使用Tomcat,都是以此类为基础实现。

此类的javadoc对其功能精确概括如下:

Minimal tomcat starter for embedding/unit tests. Tomcat supports multiple styles of configuration and startup - the most common and stable is server.xml-based, implemented in org.apache.catalina.startup.Bootstrap. This class is for use in apps that embed tomcat.

看下此类的内部

从AbstractRunMojo的startContainer方法内部,包含对其调用


Tomcat类内部预设置的一些值


maven命令执行时,会将命令执行的当前目录做为tomcat的工作目录,代码是下面这个样子:

System.setProperty( "catalina.base", configurationDir.getAbsolutePath() );

了解catalina.base,可以后台回复001了解详情。

同时,此类在对于Tomcat的单元测试中也大量使用,看下面的代码:


Tomcat类内提供的大量方便快速操作容器的方法,可以高效完成测试。

对于tomcat maven plugin的源码,官网默认下载的源码中并不包含。如果有朋友需要,可以在此下载

http://svn.apache.org/repos/asf/tomcat/maven-plugin/

下载时需要svn。

了解了mini Tomcat,以后的开发中,可以快速在maven中使用它,来提高你的工作效率吧。

如果感觉有用,请转发到朋友圈,让更多朋友看到。

扫描或长按下方二维码,关注我,一起交流。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值