Title: Apache TomEE

Apache TomEE, pronounced "Tommy", is an all-Apache Java EE 6 Web Profile certified stack where Apache Tomcat is top dog. Apache TomEE is assembled from a vanilla Apache Tomcat zip file. We start with Apache Tomcat, add our jars and zip up the rest. The result is Tomcat with added EE features - TomEE.

<a class="btn primary large" href="downloads.html">Download Apache TomEE Now &raquo;</a>&nbsp; and <a href="documentation.html">get started today!</a>

## TomEE

{row
{span6


The Web Profile version of TomEE contains

 - **CDI** - Apache OpenWebBeans
 - **EJB** - Apache OpenEJB
 - **JPA** - Apache OpenJPA
 - **JSF** - Apache MyFaces
 - **JSP** - Apache Tomcat
 - **JSTL** - Apache Tomcat
 - **JTA** - Apache Geronimo Transaction
 - **Servlet** - Apache Tomcat
 - **Javamail** - Apache Geronimo JavaMail
 - **Bean Validation** - Apache BVal

## TomEE+

The TomEE Plus distribution adds the following:

 - **JAX-RS** - Apache CXF
 - **JAX-WS** - Apache CXF
 - **JMS** - Apache ActiveMQ
 - **Connector** - Apache Geronimo Connector

}
<div class="span5" style="float:right; width:350px" width="350px">
    <img src="resources/images/microprofile.png" alt="Microprofile" style="float:left; margin-right:5px;">
    <p style="font-size:13px;line-height:18px;">Microprofile is an open forum to optimize Enterprise Java for a microservices architecture by innovating across multiple implementations and collaborating on common areas of interest with a goal of standardization. TomEE is actively participating in this effort, and would welcome help from the community in moving this process forward.</p>
    <p><a class="btn primary"target="_blank" href="http://microprofile.io/">Find out more</a></p>
</div>
<div class="span5" style="float:right; width:350px" width="350px">
    <img src="resources/images/Geek-Choice-Awards-App-Server-100x100-black.png" alt="Geeks Choice Award" style="float:left; margin-right:5px">
    <p style="font-size:13px;line-height:18px;">RebelLabs released an annual study with awards to recognize Geeky Excellence for 2014. Tomcat and TomEE were named as one of the 10 Geek Choice Awards winner. For a complete list of winners, check out the report <a target="_blank" href="http://zeroturnaround.com/rebellabs/10-kick-ass-technologies-modern-developers-love/">"10 Kick-Ass Technologies Modern Developers Love"</a>.</p>
    <p><a class="btn primary"target="_blank" href="http://zeroturnaround.com/rebellabs/10-kick-ass-technologies-modern-developers-love/10/">Read the Report</a></p>
</div>
{span10
{hero-unit
<iframe width="460" height="264" src="http://www.youtube.com/embed/eCrtoSTZ2RE" frameborder="0" allowfullscreen></iframe>
}
}
}


#  Our Goal

Simple, get much more from Apache Tomcat, yet without giving anything up.

#  Principles

Some core principles guide the integration:

- Don't mess with Tomcat - Just take it as it comes and extend it
- Keep it as simple as possible for the end user
- Avoid architectural overhead - It should just run existing applications out of the box

The desire to beef-up Tomcat installations has persisted despite the existence of full-profile application servers,
many of which actually include Tomcat in some truncated or stripped-down form.
TomEE strives to fill this gap.

# Under the Covers

Apache TomEE is assembled from a vanilla Apache Tomcat official distribution.
No picking and choosing individual parts of Tomcat and building a "new" server
leveraging Tomcat.  We start with Tomcat, add our jars and configuration and zip up the rest.
 The result is Tomcat with added EE features, TomEE.

Tomcat provides plenty of hooks for filling out parts of its lifecycle.  We
leverage them all to fill the gaps.  The result is a whole lotta sharing!

Servlets now get access to JPA and Transactions, EJBs get access to Tomcat
provided Security.  Any Tomcat provided resources, say from a context.xml,
can be looked up or injected by *any* managed component in the system.

# Keep it Tight, Keep it Simple

There's a definite "less is more" philosophy in Apache TomEE.  It's too
easy to go too far when developing an app server.  The result is usually a
slow to start, memory hogging, beast.  We're not here to create an ultra
flexible, super powerful, infinitely composable, be anything to anyone
platform.  We're here to deliver Java EE 6 Web Profile in the simplest way
possible.

If you were to imagine taking a plain Tomcat install and integrating the
missing components in the most direct and to-the-point style possible,
you'd end up with TomEE.  The result speaks for itself:

 - Runs without any additional memory requirements
 - Compatible with most Tomcat-aware tools
 - Compatible with Tomcat-tested apps

# History

In Apache TomEE's previous life, it was simply known as the OpenEJB+Tomcat
integration.  That description was always quite misleading.  For one,
there's incredible benefit even if EJB is never used.

Quite simply, EJB as a technology integrates with the most number of specs
than any other spec.  It touches JMS, Web Services, Connectors, Servlets
(EJB Web Services are still driven by Servlets!), JPA, JDBC, Transactions,
Security.  Integrating with all these technologies takes time and expertise
and in the end has very little to do with EJB specifically.  To apply this
all to Tomcat and leverage it all from a simple Servlet is a natural
extension and the reason most app servers started out as EJB servers.

Whereas most app servers pluck Tomcat out of its environment, Apache
OpenEJB has always existed as an embeddable container focused on being as
tiny and invisible as possible.  The natural extension of this is to embed
the "EE" into Tomcat, rather than the other way around.

But in the end, it is not about EJB.  It's about the other guys: ActiveMQ,
CXF, MyFaces, OpenJPA, OpenWebBeans, and of course Tomcat!  So out with
OpenEJB+Tomcat and in with Apache TomEE!
