posts - 496,comments - 227,trackbacks - 0
https://www.iflym.com/index.php/code/use-embeded-tomcat-to-javaee-start-tomcat.html

昨天在网上研究了下关于将tomcat嵌入到主程序中进行运行,而不是像以前将一个web项目copy到tomcat中进行运行。之所以这样做的原 因,即是因为项目部署到客户方,在进行更新的时候,需要手动地进行更新,再把相应代码copy到tomcat,然后再运行。运用embeded tomcat就可以将项目与tomcat分开,在进行更新时,先使用自定义的程序进行自动化更新,待更新完毕之后,再启动tomcat(或其它 javaee容器)进行项目运行。

     这样做的最终效果就是修改了项目的运行方式。原先的运行方式是以tomcat为中心,由tomcat来启动和终止项目,现在是由我们的启动程序 为中心,由启动程序来负责启动和终止项目。就相当于现在流行的cs程序一样,有单独的启动脚本,在启动时进行环境预初始化,更新程序以及其它操作,待完成 之后再进行最终的项目启动。

     这篇主要讲解如何使用embeded tomcat在代码中进行启动和终止。网上的一般文章均为tomca5.x来做,这里使用了最新的tomcat7,因为tomcat7为embeded开 发,单独发布了org.apache.tomcat.embed包,以进行独立的embed开发。以下是相应的maven包

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<dependency>
            <groupid>org.apache.tomcat.embedgroupid>
            <artifactid>tomcat-embed-coreartifactid>
            <version>7.0.2version>
        dependency>
        <dependency>
            <groupid>org.apache.tomcatgroupid>
            <artifactid>tomcat-utilartifactid>
            <version>7.0.2version>
        dependency>
        <dependency>
            <groupid>org.apache.tomcat.embedgroupid>
            <artifactid>tomcat-embed-jasperartifactid>
            <version>7.0.2version>
        dependency>
        <dependency>
            <groupid>org.apache.tomcat.embedgroupid>
            <artifactid>tomcat-embed-logging-juliartifactid>
            <version>7.0.2version>
        dependency>

    使用了embed包中的core包,以及用于编译jsp的jasper包,然后是工具类以及进行上场记录的logging-juli包。开始写代码:

1
2
3
4
5
6
7
//设置工作目录
        string catalina_home = "d:/";
        tomcat tomcat = new tomcat();
        tomcat.sethostname("localhost");
        tomcat.setport(startport);
        //设置工作目录,其实没什么用,tomcat需要使用这个目录进行写一些东西
        tomcat.setbasedir(catalina_home);

    上面使用了tomcat类来进行启动类,在tomcat7以前均是使用一个叫embed类来进行启动,在tomcat7之后,embed类被不建 议使用,而建议使用新的tomcat类来进行启动了。然后设置主机名,端口,再设置一个工作目录。这个工作目录可以是任意目录,主要是tomcat需要这 个目录来记录一些东西,比如记录word信息,日志信息(如果配置了日志的话),以及临时文件存储等。

1
2
3
4
5
6
7
8
//设置程序的目录信息
        tomcat.gethost().setappbase("e:/");
        // add aprlifecyclelistener
        standardserver server = (standardserver) tomcat.getserver();
        aprlifecyclelistener listener = new aprlifecyclelistener();
        server.addlifecyclelistener(listener);
        //注册关闭端口以进行关闭
        tomcat.getserver().setport(shutdownport);

    上面的代码,首先设置我们的项目程序所在的appbase,即放项目代码的地方。在通常的tomcat配置中,这个目录一般是webapps。接 着设置一个listener,这个listener主要是负责启动一些比如html native支持程序以及ipv6等信息配置(可以忽略)。接着是配置一个关闭的注册端口,当向这个端口发送信息时,就可以达到关闭tomcat的目的 (后面会讲)。

1
2
3
4
5
6
7
8
9
//加载上下文
        standardcontext standardcontext = new standardcontext();
        standardcontext.setpath("/aa");//contextpath
        standardcontext.setdocbase("aa");//文件目录位置
        standardcontext.addlifecyclelistener(new tomcat.defaultwebxmllistener());
        //保证已经配置好了。
        standardcontext.addlifecyclelistener(new tomcat.fixcontextlistener());
        standardcontext.setsessioncookiename("t-session");
        tomcat.gethost().addchild(standardcontext);

    我们单独使用了一个context来为这个host添加上下文,tomcat本身提供一个方法tomcat.addweb方法来添加项目包,不过 由于这里需要单独设置一个tomcat的sessionname,所以使用与与tomcat.addweb实现类似的方法来添加一个项目包。
    以上代码中有两个需要注意的listener,一个是defaultwebxmllistener,这个是由tomcat加载一些默认的配置信 息,比如jspservlet,以及一些繁复的mime/type信息;加上这个,就不需要我们自己去写这么多的配置,因为每个项目都需要这些。这个配置 与tomcat目录下的conf/web.xml中的配置一样,只不过这里是代码化了。第二个是fixcontextlistener,这个主要是在项目 部署完后,将这个上下文设置为configured,表示已经配置好了(不然,tomcat启动时会报错,即相应上下文还未配置好)。
    配置ok了之后,就是启动tomcat了:

1
2
tomcat.start();
        tomcat.getserver().await();

    启动tomcat,并让tomcat在关闭端口上监听。如果没有最后一句,程序将直接结束,保证监听之后,tomcat将一直监听关闭事件,待有关闭事件之后才结束当前程序。所以如果想要关闭当前的tomcat,只需要向关闭端口发送一些信息即可:

1
2
3
4
5
6
7
8
9
private static void shutdown() throws exception {
        socket socket = new socket("localhost", shutdownport);
        outputstream stream = socket.getoutputstream();
        for(int i = 0;i < shutdown.length();i )
            stream.write(shutdown.charat(i));
        stream.flush();
        stream.close();
        socket.close();
    }

    这样即可达到关闭tomcat的目的。

     实际上看整个项目代码,项目代码的运行,就是一个配置一个基础的server.xml(即tomcat目录下的 conf/server.xml),先配置运行端口,关闭监听端口;然后配置运行的host以及添加一个上下文context,最后就开始运行并开始监 听。对照这个程序,再看一下server.xml中的配置信息,就很容易明白以上这段代码了。

posted on 2016-07-18 14:42 simone 阅读(4420) 评论(0)  编辑  收藏 所属分类: javatomcat
"));
网站地图