前面我们介绍的内容都是使用独立的Tomcat软件包,我们的程序需要部署到Tomcat中。实际上还有一种方式是“Embed Tomcat”,我们通过Maven依赖将Tomcat的核心功能引入工程,然后通过工程的main()
方法启动服务。这样我们甚至可以将整个应用程序打包成一个可执行Jar,直接部署到任何有JDK的环境中,无需再安装、配置Tomcat了。
Embed Tomcat进行了模块的拆分和精简,启动极为迅速。近年来随着SpringBoot的流行,相比传统的Tomcat部署方式,这种嵌入式的Tomcat使用更加广泛,它也更加适合容器化环境部署。
这里我们先不考虑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则没必要引入该包。
下面例子代码中,我们使用纯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响应了。