嵌入式Tomcat

前面我们介绍的内容都是使用独立的Tomcat软件包,我们的程序需要部署到Tomcat中。实际上还有一种方式是“Embed Tomcat”,我们通过Maven依赖将Tomcat的核心功能引入工程,然后通过工程的main()方法启动服务。这样我们甚至可以将整个应用程序打包成一个可执行Jar,直接部署到任何有JDK的环境中,无需再安装、配置Tomcat了。

Embed Tomcat进行了模块的拆分和精简,启动极为迅速。近年来随着SpringBoot的流行,相比传统的Tomcat部署方式,这种嵌入式的Tomcat使用更加广泛,它也更加适合容器化环境部署。

引入Maven依赖

这里我们先不考虑SpringBoot,还是以一个最基础的Java工程为例进行介绍。为了使用Embed Tomcat,我们需要引入如下的Maven依赖。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>9.0.65</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>9.0.65</version>
</dependency>

其中,tomcat-embed-core是Embed Tomcat的核心包,tomcat-embed-jasper是JSP的解析引擎,如果我们的工程不涉及JSP则没必要引入该包。

使用Embed Tomcat例子

下面例子代码中,我们使用纯Java代码创建了一个Tomcat服务器对象,然后实现了一个Servlet对象并配置到Tomcat中。

package com.gacfox.demo;

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;

public class Main {
    public static void main(String[] args) throws LifecycleException {
        // 创建Tomcat服务器对象
        Tomcat tomcat = new Tomcat();
        tomcat.setHostname("localhost");
        // Tomcat工作路径
        tomcat.setBaseDir("E:\\tmp");

        // 连接器配置
        Connector connector = new Connector();
        connector.setPort(8080);
        tomcat.setConnector(connector);

        // 上下文配置
        Context context = tomcat.addContext("", "/ROOT");
        Tomcat.addServlet(context, "MainServlet", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setCharacterEncoding("UTF-8");
                resp.setContentType("text/plain");
                resp.setHeader("Server", "Embedded Tomcat");
                try (Writer writer = resp.getWriter()) {
                    writer.write("Hello, Embedded Tomcat!");
                    writer.flush();
                }
            }
        });
        context.addServletMappingDecoded("/", "MainServlet");

        // 启动服务
        tomcat.start();
        tomcat.getServer().await();
    }
}

Embed Tomcat启动时也需要指定工作目录,这里注意Tomcat的工作路径下,需要包含webapps文件夹和webapps/ROOT文件夹,否则是无法启动的,当然我们也可以使用Java代码进行自动创建。其余部分代码其实和前面介绍的Tomcat中各个组件是一致的,我们首先创建Connector,然后创建具体工程的Context,然后编写了一个Servlet添加到其中。

工程启动后,我们的程序就可以正常接收HTTP响应了。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap