`

应用内置embeded tomcat,并打包为fat jar的解决方案

    博客分类:
  • SSH
阅读更多

http://blog.csdn.net/hengyunabc/article/details/51069276

 

需求

大量的微服务框架引起了一大波embeded tomcat,executable fat jar的潮流。显然spring boot是最出色的解决方案,但是spring boot有两个不足的地方:

  • 不支持配置web.xml文件,对于旧应用迁移不方便
  • 一些配置在web.xml里配置起来很直观,放到代码里配置就难搞清楚顺序了。比如一些filter的顺序关系。
  • spring boot的方案依赖spring,对于一些轻量级的应用不想引入依赖

基于这些考虑,这里提出一个基于embeded tomcat本身的解决方案。

代码地址

https://github.com/hengyunabc/executable-embeded-tomcat-sample

支持特性:

  • 支持加载传统的web.xml配置
  • 支持打包为fat jar方式运行
  • 支持在IDE里直接运行

旧应用迁移步聚

旧应用迁移非常的简单

  • 在pom.xml里增加embeded tomcat的依赖
  • 把应用原来的src/main/webapp/WEB-INF 移动到 src/main/resources/WEB-INF下,把在src/main/webapp下面的所有文件移动到 src/main/META-INF/resources目录下
  • 写一个main函数,把tomcat启动起来

非常的简单,完全支持旧应用的所有功能,不用做任何的代码改造。

工作原理

web.xml的读取

传统的Tomcat有两个目录,一个是baseDir,对应tomcat本身的目录,下面有conf, bin这些文件夹。一个是webapp的docBase目录,比如webapps/ROOT 这个目录。

docBase只能是一个目录,或者是一个.war结尾的文件(实际对应不解压war包运行的方式)。

tomcat里的一个webapp对应有一个Context,Context里有一个WebResourceRoot,应用里的资源都是从WebResourceRoot 里加载的。tomcat在初始化Context时,会把docBase目录加到WebResourceRoot里。

tomcat在加载应用的web.xml里,是通过ServletContext来加载的,而ServletContext实际上是通过WebResourceRoot来获取到资源的。

所以简而言之,需要在tomcat启动之前,web.xml放到Context的WebResourceRoot,这样子tomcat就可以读取到web.xml里。

静态资源的处理

在Servlet 3.0规范里,应用可以把静态的资源放在jar包里的/META-INF/classes目录,或者在WEB-INF/classes/META-INF/resources目录下。

所以,采取了把资源文件全都放到src/main/META-INF/resources目录的做法,这样子有天然符合Servlet的规范,而且在打包时,自然地打包到fat jar里。

Fat jar的支持

Fat jar的支持是通过spring-boot-maven-plugin来实现的,它提供了把应用打包为fat jar,并启动的能力。具体原理可以参考另外一篇博客:http://blog.csdn.net/hengyunabc/article/details/50120001

当然,也可以用其它的方式把依赖都打包到一起,比如maven-assembly-plugin/jar-with-dependencies ,但不推荐,毕竟spring boot的方案很优雅。

其它

http://home.apache.org/~markt/presentations/2010-11-04-Embedding-Tomcat.pdf

官方的Embedded Tomcat文档

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/basic_app_embedded_tomcat/basic_app-tomcat-embedded.html

oracle的技术文档里的一个方案,但是这个方案太简单了,不支持在IDE里启动,不支持加载web.xml文件。

https://github.com/kui/executable-war-sample

这个把依赖都打包进war包里,然后在初始化tomcat里,直接把这个war做为docBase。这样子可以加载到web.xml。但是有一个严重的安全问题,因为应用的.class文件直接在war的根目录下,而不是在/WEB-INF/classes目录下,所以可以直接通过http访问到应用的.class文件,即攻击者可以直接拿到应用的代码来逆向分析。这个方案并不推荐使用。

实际上spring boot应用以一个war包直接运行时,也是有这个安全问题的。只是spring boot泄露的只是spring boot loader的.class文件。

分享到:
评论

相关推荐

    使用embeded tomcat进行嵌入式javaee开发-启动tomcat

    在JavaEE开发中,使用内嵌的Tomcat服务器(通常称为embeded Tomcat)是一种常见的实践,它允许开发者在本地环境中快速、方便地测试和调试应用程序,而无需手动配置独立的服务器实例。本文将深入探讨如何使用embeded ...

    EmbeddedTomcat:嵌入式Tomcat工作示例。 Tomcat版本8.5.38。 谢谢Heroku

    嵌入式Tomcat是将Apache Tomcat服务器作为一个库来集成到Java应用程序中,而不是作为独立的服务运行。这种模式常用于创建轻量级的Web应用程序,尤其是对于开发、测试或者部署在本地环境的需求非常方便。标题提到的是...

    嵌入式系统课件[Embeded System]

    这个名为"嵌入式系统课件[Embeded System]"的压缩包文件,显然是为学习和教学嵌入式系统知识而准备的。下面将详细阐述嵌入式系统的概念、特点、应用以及学习它的必要性。 嵌入式系统,顾名思义,是嵌入到特定设备或...

    Modular-Java-Jersey-Vue:Moduler Java,嵌入式Tomcat,Jersey,Vue,Restfull WebApp

    模块化Java,嵌入式Tomcat,Fat Jar,Vue JS 该应用程序演示了面向服务的RESTfull应用程序的各个部分。 演示(Heroku托管) 大约需要2-3分钟才能启动实例 技术栈 零件 技术 后端郎 Java 11(带有模块) 宁静的...

    嵌入式系统(embeded system)

    - **指定-探索-细化**:从高层的可执行规范开始,逐步细化到具体的硬件和软件组件,同时评估各种设计方案。 #### 动机 文章通过一个简单的示例说明了嵌入式系统设计过程中的关键步骤:如果变量`x`等于0,则计算`y ...

    automotive embeded system

    this is a book describing the princple, the development process of the automotive embeded systems. by this book, our can perceive the most advanced and basic technologies of the automotive electronic ...

    c-embeded-system-learning.rar_Embeded Systems

    在“c-embeded-system-learning.rar_Embeded Systems”这个压缩包中,我们可以找到两个文件,一个是核心的学习资料“c-embeded-system-learning.pdf”,另一个可能是资源链接或参考信息的文本文件“www.pudn.com.txt...

    EW字符文件转换器(Embeded wizard辅助工具)

    总结来说,“EW字符文件转换器”是提升Embeded Wizard项目开发效率的利器,通过与Excel的结合,为字符串管理提供了一个灵活且高效的解决方案。对于任何使用Embeded Wizard进行GUI开发的团队,这个辅助工具都是不可或...

    Embeded wizard辅助工具

    《Embeded Wizard辅助工具详解与应用》 在嵌入式系统开发中,界面设计和本地化处理是一项重要的任务。为了简化这一过程,一种名为“Embeded Wizard”的工具应运而生,它允许开发者创建和管理丰富的图形用户界面。...

    embeded-Linux-introduction-070822.rar_embeded_linux

    6. **文件系统构建**:嵌入式Linux的文件系统可以是基于ramdisk、JFFS2、YAFFS、FAT或ext4等格式。开发者需要创建包含所需应用程序、库和配置文件的文件系统映像。 7. **Bootloader**:Bootloader是启动过程中的第...

    embeded cd

    标题“embeded cd”指的是嵌入式CD,这通常是指包含特定软件或系统的光盘,被集成在硬件设备中,用于启动和运行设备的操作系统或应用程序。在这个上下文中,描述“embeded 090147372_book_WiinCE_for_Embest_EduKit...

    Windows嵌入式开发系列课程(2):使用Embeded Visual C++开发通讯终端及应用实例代码分析

    在Windows嵌入式开发领域,使用Microsoft的Embedded Visual C++(EVC)工具是一个常见的选择。本课程聚焦于如何利用EVC...通过深入学习和实践,可以更好地应对各种嵌入式通讯终端的挑战,设计出高效、稳定的解决方案。

    embeded linux fast guide

    本章详细讲解了选择嵌入式硬件平台的考虑因素,如处理器架构(ARM、MIPS、PowerPC等)、内存大小、存储解决方案、外设接口等,并给出了一些常见嵌入式开发板的比较。 第3章:Bootloader Bootloader是启动嵌入式系统...

    embeded linux primer 2nd

    this book guides you embeded development.

    embeded_timer.rar_embeded c++_嵌入式超时

    总的来说,"embeded_timer.rar"这个资源包为我们提供了一次深入学习和实践嵌入式C++定时器的机会,通过理解并应用其中的理论和代码,我们可以更好地理解和掌握嵌入式系统中定时器的超时保护功能。

    jar生成exe文件[收集].pdf

    Java程序通常以.jar文件的形式发布,但为了便于非Java开发者使用,可以将其转换为Windows操作系统下的.exe可执行文件。本文将介绍两种常见的方法,即JSmooth和exe4J,将Java程序转换为.exe文件。 首先,JSmooth是一...

    windows embeded compact 7

    win CE7安装包,安装时间比较长,需要耐心等待。

    embeded android hottest!!!

    在IT行业中,Android系统无疑是移动开发领域的巨头,其在智能设备上的广泛应用...在实际工作中,结合这份资源进行学习和实践,可以有效地解决开发过程中遇到的问题,提高开发效率,为个人和团队的发展注入新的动力。

    Building Embeded Linux system

    - **存储技术**:研究了嵌入式领域内的各种存储解决方案,包括闪存(Flash)、SSD、EMMC等,并分析了它们的性能特点和适用场景。 - **网络技术**:介绍了嵌入式设备中的网络通信技术,涵盖了基本的网络协议栈(TCP/...

    embeded方法构建决策树决策点,解决一部分缺失插补问题.zip

    总结来说,embeded方法在决策树中的应用为处理缺失值提供了一种有效且灵活的策略。它结合了模型构建和插补过程,确保了模型的训练和预测能够充分考虑缺失值的影响。通过这种集成方法,我们可以构建出更鲁棒、更准确...

Global site tag (gtag.js) - Google Analytics