为什么selecttomcat而不是java EE兼容的应用程序服务器?

Java EE应用程序服务器提供了tomcat的所有function,那么为什么要使用tomcat(而不是glassfish,因为它是官方的)?

特别是当像JPA,JAX-RS,JSF那样需要Java EE特性时,因此更多的库必须与应用程序打包在一起,而符合EE标准的应用程序服务器将提供开箱即用的function。

我们心中的问题以及我们创造TomEE的全部原因是,人们为什么要select?

整个“Tomcat或JavaEE”的东西是累了,老了。

十年之后,它仍然出现,人们争论什么更好,为什么。

这里是简短的mathexpression式:

  • 在Java EE 6中,我们(JCP)创build了Web Profile,正式承认使用一组专门技术来缩短运行时间的必要性。

太好了,我们已经到了一半了,但是人们仍然在争论“Tomcat 或者 JavaEE”。 解决scheme很明确,Tomcat需要通过Java EEauthentication。 网页configuration文件是为了准确地创build。

  • 在2011年,我们(Apache)开始进行Apache Tomcatauthentication工作。 在JavaOne 2011上宣布authentication为Apache TomEE。 四月份公布最终版本。

真棒,现在我们在那里。

新的现状

  • 有一个JavaEE的轻型版本
  • 有一个JavaEEauthentication的Tomcat版本

所有这些都发生在过去的2年。 事情变了。

如果你想要Tomcat和JavaEE ,你可以拥有它。

人们很less使用普通的Tomcat。 他们总是添加大量额外的东西,如networking框架,一些orm,一些DI框架等。

你可以使用Spring来实现这个function,但是最终的结果会很大,而且你会被迫进行大量的XML编程。

现代Java EE 6的实现是非常轻量级的(TomEE和Resin只有25mb),包含了你需要的一切(web,persistence,DI)。 所谓的Webconfiguration文件不包含任何您只需要的东西。 现代的Java EE 6服务器在一两秒钟内就可以启动,与一个裸露的Tomcat完全相同,但实际上它们每天都会提供所需的工具。

大多数Java EE应用程序服务器体积庞大,带有许多不需要的function,而且开发/testing周期非常缓慢(请查看java反叛生产力报告)。 如果您确实需要某些Java EE特性,那么您应该使用它,但大多数情况下您可以拥有相同的基本特性(本质上是servlet容器,您可以将大部分Java EE技术放在一个tomcat上,比如轻量级ejb容器等)与tomcat或任何其他轻量级servlet容器。

另外请记住,您可以在应用程序服务器之外使用JPA,JSF,JAX-RS。

TL; DR: Java EE应用程序服务器显然很慢,不要在运行中重新加载类,并强制执行一个非常令人恼火的代码/部署/testing周期(从20秒到8分钟,以testingjava代码中的某些更改)。 大多数人只需要基本的function(本质上是servlet容器)。

以下是2011年重新部署时间的报告:http: //zeroturnaround.com/java-ee-productivity-report-2011/#redeploy_times

正如@Miguel Ping所解释的那样,应用程序服务器包含开发人员不需要的function。
例如,许多开发人员不需要代码进行消息传递,因此他们不需要JMSjar子。
其他开发人员可能不需要集群,因此他们不需要集群代码,等等。
由于今天大多数UI都面向Web,所以必须由应用程序服务器提供的Servlet容器变得越来越重要,因此许多开发人员决定只使用一个Servlet容器(即tomcat)。
在这种情况下,许多开发人员使用Spring框架来提供replace原有Java EE的function(或者与Java EE集成 – Spring也可以在应用程序服务器上运行)。
Spring-core是lightware,主要提供了一个Depression Injection / Inversion-Of-Control容器(在Java EE中取代了EJB容器)。
您可以添加Spring框架中的其他模块来为您的应用程序提供更多function,而在许多应用程序服务器(EJB 3.0及更低版本)中,应用程序服务器正在加载整个堆栈,这也影响了Application Server的启动时间对于开发者来说是相当烦人的,从个人经验来看)。

话虽如此,EJB 3.1现在包含configuration文件,例如Webconfiguration文件,该configuration文件从Java EE规范中加载较less的部分。 另外,Jboss在JBoss AS 7中引入了一个并行部署机制来分析应用程序中的依赖关系,并执行独立组件的并行部署。
例如,在oVirt开源项目中,我们将开始时间从一个简单的虚拟化环境部署时间缩短到3秒钟。
我不知道在其他EJB 3.1应用程序服务器中是否存在这样的机制,但是,如前所述,您可以很容易地定义configuration文件,或者使用已经存在的configuration文件(例如Webconfiguration文件(EJB lite))以减less启动时间

总之,在过去,人们使用tomcat主要是为了减less启动时间,减less模块的加载量。
Spring提出了Java EE开发的模块化替代scheme,可以和tomcat一起使用。
。 现在,随着EJB 3.1的推出,Java EE也进行了模块化,并且还有诸如JBoss AS 7之类的应用服务器,由于在部署过程中进行了各种优化,因此可以将启动时间缩短到几秒钟。

Tomcat是一个写得很好的轻量级servlet容器,可以完成大量JVM Web应用程序所需的一切。 它作为一个Web服务器直接与浏览器对话生产效果良好。 对于很多人来说,Java EE中有太多的东西,比构build稳定有用的应用程序更需要。 这种types的人寻找具有较less,而不是更多的工具,而且值得注意的是function上面写得很好的代码。 软件select的世界是一个市场,Tomcat很好地服务于这个市场的一部分。 就像在任何市场上一样,您需要考虑各种select,并select符合您需求的产品。 Tomcat只是众多select之一。

有关devise结构matrix的文章http://www.people.hbs.edu/cbaldwin/DR2/LaMantia-Cai-MacCormack-Rusnak%20WICSA2008.pdf中有一个有趣的Tomcat观点。; 他们将它与一个未命名的竞争对手进行比较,并发现它devise得很好。 如果您有兴趣分析您自己的代码,我知道的唯一的DSM实施是IntelliJ Enterprise版本,但它们会给您几个星期的免费试用版。

就我个人而言,我相信简单是支持软件的优点,servlet容器是支持软件,而不是应用程序的一部分。

在大多数情况下,根据小型IT部门和IMO的pipe理/开发团队的经验和知识,决定应用程序服务器select(Tomcat和AS,如JBoss),这是政治性的而不是技术性问题。 而且,最多部署在tomcat上的项目往往是Web应用程序,集成概念和复杂度都很低。 对于这样的项目,通常会使用轻量级的容器和框架(Spring,Struts)。但是,如果项目变得越来越复杂,分布越来越多,像“可视性”,“监视”,高可用性(如JBoss的@HASingleton)到位。 然后可以非常痛苦地装备你的纯粹的tomcat与第三方框架,以获得所有function的AS'和大多数时候你会challange一起运行所有这些。

他们认为他们select轻量级,但在一天结束时,他们的应用程序将比使用Java EE Webconfiguration文件重得多。 如果他们selectspring,他们的部署可能会非常大,build设和服务器启动时间较慢。 开发人员效率下降…如果您希望您的应用程序尽可能简单轻便,请select支持Webconfiguration文件的Java EE服务器。