Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在应用中嵌入Tomcat

在应用中嵌入Tomcat

作者头像
哲洛不闹
发布于 2018-09-18 03:22:33
发布于 2018-09-18 03:22:33
2.3K0
举报
文章被收录于专栏:java一日一条java一日一条

很多 Java web 应用和服务,包括开源的和商业化的(比如 Alfresco, iRise, Confluence等),都倾向于将 Apache Tomcat Servlet 引擎整个嵌入到他们的分发包中。Atlatisan公司甚至只支持他们自己提供的嵌入式Tomcat 包,不再提供 WAR/EAR 形式的分发包。这些安装包包含了整个 Tomcat 引擎和配置文件,看起来确实有点大材小用。在大多数配置中,默认的配置文件甚至从来不会变动。真的有办法可以在代码中启动 Tomcat 并且只需要 tomcat 的 jar 文件作为依赖么?在下面的教程中,我们将会对 Jetty (Jetty 是一个为此目的而设计的一种嵌入式 servlet 引擎)进行测试,同时还会展示如何将 Jetty 迁移到 Tomcat 。

我开始研究嵌入式 Tomcat 是因为 BigSense 项目,该项目是一个开源 web 服务,用于模拟传感器网络。我的目的是可以将其作为一个标准的 Linux 软件包进行分发,这样就可以作为一个服务启动,而不用依赖于 Tomcat 软件包。下面的例子使用的是 Scala 语言,BigSense 项目用的也是这种开发语言,但是你也可以轻松地将所有源码和概念转换为 Java 语言。

首先,创建一个 trait(类似于 Java 中的接口),里面包含两个简单的功能,用于启动和停止 web 服务器。端口号可以从配置文件中获取。这是我的实现中唯一可配置的了,但是你也可以对 context path 添加配置。

下面是我使用 Scala 对 Jetty 的实现。大部分是直接从 Jetty 的官方文档中摘出来的。所有的静态资源(图片,CSS 和 javascript 脚本)都被直接打包到了 jar 文件中,可以作为类路径的资源进行访问。如果使用构建工具,如 SBT,Gradel 或者 Maven,可以将这些文件放到项目的 src/main/resources 目录下。Jetty 的 WebAppContext 允许调用 setResourceBase 来使用项目的静态资源。这个例子还展示了如何使用给定的 Context 路径来添加一个 Servlet (在这个例子中,只有一个 servlet,匹配根目录,名字为 MasterServlet)。还可以看到一个 EventListener 的例子。web.xml 中的大部分标准配置在 Jetty 中都可以使用代码进行设置。

Tomcat 的实现比较复杂。也没有足够的关于使用嵌入式 Tomcat 和配置代码的文档。在下面的例子中,我创建了一个 org.apache.catalina.startup.Tomcat 实例。当向 Tomcat 中添加 Servlets 时,因为一些原因需要指定它的工作目录。我这里是以一种平台依赖的方式使用系统属性 java.io.tmpdir 来获取一个临时文件夹。(注意:在本地环境下运行的时候会产生一个空的 ./tomcat.8080 目录)。虽然我不清楚怎样添加一个事件监听器,但却意识到了监听器甚至不会使用它持有的 context,因此只是手动调用它而没有使用context。最后,我在 Tomcat 的文档中没有找到类似 Jetty 中的 setResourceBase 方法来获取静态资源,因此只能创建一个自己的 StaticContentServlet,接下来将会看到。

这个获取静态资源的 servlet 只有一些基本功能。只是简单地找到类路径下的资源并返回。难点是正确地设置 Mime-Type。我尝试使用 javax.activation.FileTypeMap 基于扩展名来获取准确得 mime 类型,但是经常会得到错误的结果。因此,对于项目中已知静态文件的 mime 类型通过硬编码进行了实现。

依赖相当简单,只需添加需要的 Tomcat 和 Jetty 包就可以了。下面展示了在一个 buiuld.sbt 文件中的依赖,但这样的配置只能用于 Maven,Gradel或者Ivy。检查一下,然后确认你使用的是最近版本的 Jetty 以及/或者 Tomcat,因为它们可能会有变化。

从这里开始,创建一个 main 函数,然后启动你的服务器将会变得非常简单。我使用了一个名为 sbt-native-packager 的插件来创建 deb 和 rpm 文件,其中会用到相关的初始化脚本或 SystemD 服务文件。这么做允许你像安装一个标准的 Linux 安装包一样来安装 BigSense,作为标准服务独立于系统的 Tomcat,并且不需要多余的 war 或 ear 文件。

当然,这样做也有缺点。比如你有很多 web 应用都按这种方式进行部署,对于每个应用来讲就是启动一个完整 Tomcat 和 JVM 实例。即使 Tomcat 相对来讲(和 JBoss 或者 WebSphere 比起来)是轻量级的,仍然是比较重的,会耗费相当多的资源,这一点在虚拟机上尤为明显。

如果在你的空间中有很多 apps,使用系统中的 Tomcat 软件包,然后使用诸如 Fabric 之类的部署系统来维护、更新和部署你的 web 应用可能会更好点。如果你需要将应用打包给第三方,则使用嵌入式 Tomcat 是一个更好的解决方案。然而,当发现安全漏洞时,对于更新安装包来讲你就要小心了。对于嵌入式方法来讲,添加一个类似SSL的东西是比较复杂的,更好的解决方案是将类似 HAProxy 或者 Nginx 的软件作为前端代理来处理用户的 SSL 请求。

如果你是从零开始开发一个应用,应该考虑一下避免完全使用 Servlet 模式。在 JVM上,有很多为 web 服务和应用设计的异步框架,比如 Spray 和 Netty,远超这个设计于 1995 年的 HTTP Servlet API

如果你由于软件分发打算学习如何将 Tomcat 嵌入到 web 应用中,希望这篇教程可以帮到你。请时刻牢记以下这点,对于你给出的 jar 包和平台版本的 API 的变化,这些例子可能需要做一些调整来适配这些变化。虽然我只是讲到了 Tomcat 和 Jetty , 其实还有其它的嵌入式 Servlet 引擎,可以用相似的方式实现,甚至对于更新的非 Servlet 引擎(比如 Spray 和 Netty)来讲都有对 Servlet 的包装,这样你就可以在一些比较老的 web 应用上使用它们了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot tomcat自动配置原理
我们在项目栏->External Libraries->...autoconfigure里找到spring.factories
平凡的学生族
2019/10/10
7850
springboot tomcat自动配置原理
吊打 Tomcat ,Undertow 性能很炸!!
在 Java Web 容器的世界里,Tomcat 和 Jetty 是大名鼎鼎的、用的最多的开源项目,也是大众熟知的。
Java技术栈
2020/08/30
2.2K0
Jetty基本介绍 及 与tomcat对比
bin:可执行脚本文件 demo- base: etc:Jetty模块定义的XML配置文件的目录 lib:Jetty依赖的库文件 logs:Jetty的日志目录 modules:Jetty的模块 resources:外部资源配置文件的目录 webapps:项目WAR文件的目录还需要关心根目录下的一个文件:start.d(Wondows系统是start.ini文件),它定义了Jetty的活动模块。
高广超
2018/12/12
1K0
Tomcat的使用及服务器的一些基础知识
静态资源: 所有用户访问后,得到的结果是一样的,称为静态资源,静态资源可直接被浏览器解析 如 html,css,JavaScript 动态资源: 不同用户访问后得到的结果不同,动态资源被访问后要先转换为静态资源,再返回给浏览器 如:servlet/jsp,php,asp
一只胡说八道的猴子
2020/09/27
4740
Tomcat的使用及服务器的一些基础知识
E010Web学习笔记-Tomcat
应用程序在计算机的唯一标识,0~65526,将来自己写的应用程序不要用1924以内的,因为很有可能被系统占用了;
訾博ZiBo
2025/01/06
1040
E010Web学习笔记-Tomcat
Tomcat&Servlet笔记
web相关概念回顾 1. 软件架构 1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析 * 如: html,css,JavaScript 2. 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,在返回给浏览器 * 如:servlet/jsp,php,asp.... 3. 网络通信三要素 1. IP:电
楠羽
2022/11/18
3220
重学SpringBoot系列之嵌入式容器的配置与应用
在Spring Boot项目中,可以支持Tomcat、Jetty、Undertow的Web应用服务容器。当我们添加了spring-boot-starter-web依赖后,默认会使用Tomcat作为嵌入式Web容器,不需要我们单独部署,将web应用打成jar包即可运行。
大忽悠爱学习
2021/12/07
1.8K0
重学SpringBoot系列之嵌入式容器的配置与应用
Tomcat - Tomcat的套娃式架构设计初探
刚才说了tomcat核心功能有两个 : http服务器和Servlet 容器。 那tomcat为了实现如上两个核心功能又是怎样架构的呢?
小小工匠
2021/08/17
2670
Tomcat 的使用及原理分析(IDEA版)
之前我们的角色是用户,将来我们的角色内容提供者,让别人通过浏览器来访问我们写的项目。
wsuo
2020/07/31
1.5K0
Tomcat 的使用及原理分析(IDEA版)
自家表兄弟Tomcat和Jetty
Jetty是Eclipse基金会的一个开源项目,是“HTTP服务器 + Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方,实在是像一对表兄弟。
春哥大魔王
2020/03/13
1.5K0
Tomcat的基本使用
web相关概念 1. 软件架构 1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析 * 如: html,css,JavaScript 2. 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,在返回给浏览器 * 如:servlet/jsp,php,asp....
不愿意做鱼的小鲸鱼
2022/09/24
3560
Tomcat的基本使用
springboot 和 springmvc 的关系
在没有 Spring Boot 的情况下,SpringMVC 的典型配置包括以下几个部分:
用户1142828
2024/12/11
1800
SpringBoot应用部署于外置Tomcat容器
来源:https://my.oschina.net/hansonwang99/blog/1824245
程序猿DD
2018/07/31
9370
SpringBoot应用部署于外置Tomcat容器
SpringBoot 笔记 ( 四 ):web 开发
SpringBoot 笔记 (四): web 开发 1、SpringBoot对静态资源的映射规则 @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false) public class ResourceProperties implements ResourceLoaderAware { //静态资源的路径 private static final String[] CLASSPATH_RESOURCE
lwen
2018/04/16
1.9K0
SpringBoot进阶
spring-boot-starter-web:springBoot的场景启动器,里面很多依赖如:spring-web、spring-webmvc、jackson、hibernate-validator、spring-boot-starter-tomcat、spring-boot-starter
晚上没宵夜
2020/04/16
9440
Tomcat 快速入门
Tomcat 快速入门 版本说明 本文使用 Tomcat 版本为 Tomcat 8.5.24。 Tomcat 8.5 要求 JDK 版本为 1.7 以上。 简介 Tomcat 是什么 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。但是
静默虚空
2018/03/16
1.4K0
Tomcat 快速入门
【翻译】Tomcat 6.0 部署与发布
本篇参考Tomcat官方文档:《First Webapp》翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容。 1 目录结构   在tomcat中所有的应用都是放置在CATALINA_HOME/webapps下,其中CATALINA_HOME对应的是你的tomcat的根目录。   由于Servlet2.2之后的版本规范规定,tomcat中应用的目录结构都要满足固定的格式,这样便于规范一致性。   放置在webapps下的文件通常是两种格式:一种压缩好的项目文件,比如war包!一种是正
用户1154259
2018/01/17
7400
【翻译】Tomcat 6.0 部署与发布
SpringBootWeb容器配置:JAX-RS和Jersey框架、内嵌容器的配置
Web应用开发是企业开发的重要领域,Spring Boot 1.X的Web容器管理方式基于Servlet容器技术栈。Servlet容器主要基于同步阻塞I/O架构,HTTP请求和线程是一对一的关系,主要是TPR模型,即一个请求对应一个线程。主要的业务逻辑也是基于命令式的编程模式。以Spring MVC框架为主,Web容器方面以Tomcat为主,也可以通过自动配置功能改为Jetty/UnderTow容器。
愿天堂没有BUG
2022/10/28
8350
SpringBootWeb容器配置:JAX-RS和Jersey框架、内嵌容器的配置
Tomcat 面试题(总结最全面的面试题!!!)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136303.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/06
8130
【Tomcat优化篇】如何让你的Tomcat性能更加优越
  我们可以打开Tomcat的管理页面,这块需要先配置下,在 tomcat-users.xml中添加相关的用户和角色信息
用户4919348
2022/09/02
1.7K0
【Tomcat优化篇】如何让你的Tomcat性能更加优越
相关推荐
springboot tomcat自动配置原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档