Title:
Notice:    Licensed to the Apache Software Foundation (ASF) under one
           or more contributor license agreements.  See the NOTICE file
           distributed with this work for additional information
           regarding copyright ownership.  The ASF licenses this file
           to you under the Apache License, Version 2.0 (the
           "License"); you may not use this file except in compliance
           with the License.  You may obtain a copy of the License at
           .
             http://www.apache.org/licenses/LICENSE-2.0
           .
           Unless required by applicable law or agreed to in writing,
           software distributed under the License is distributed on an
           "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
           KIND, either express or implied.  See the License for the
           specific language governing permissions and limitations
           under the License.

#Deploying in TomEE

Deploying applications in TomEE is as simple as deploying them in Tomcat. 

You could deploy your application in Eclipse just like how you would deploy with Tomcat. For an example, [tomee-and-eclipse](tomee-and-eclipse.html) shows how to use TomEE with Eclipse.

Or you can simply package your application as a standard **WAR** file and copy it to the **[TomEE]/webapps** folder, or as an **EAR** file and copy it to the **[TomEE]/apps** folder.

Read on to learn more about packaging EJBs in a WAR file.


### Packaging

<a name="CollapsedEAR-Onearchive"></a>
#### One archive

The basic idea of this approach is that your Servlets and EJBs are together in your WAR file as one application.

 - No classloader boundaries between Servlets and EJBs
 
 - EJBs and Servlets can share all third-party libraries (like Spring\!) 
 
 - No EAR required.
 
 - Can put the web.xml and ejb-jar.xml in the same archive (the WAR file) 
 
 - EJBs can see Servlet classes and vice versa 

<a name="CollapsedEAR-NotquiteJ2EE(itistrulyJava EE6)"></a>
#### Not quite J2EE (But it is Java EE 6)

This is very different than J2EE or Java EE 5 as there are not several levels of separation and classloader hierarchy any more.  
This may take some getting used to and it is important to understand that this style of packaging is **not** J2EE compliant.  
You should not worry though, as it is an accepted feature of Java EE 6.

#### J2EE classloading rules:
 - You cannot ever have EJBs and Servlets in the same classloader.

 - Three classloader minimum; a classloader for the ear, one for each
ejb-jar, and one for each WAR file.

 - Servlets can see EJBs, but EJBs cannot see Servlets.

 To pull that off, J2EE has to kill you on packaging:
 - You cannot have EJB classes and Servlet classes in the same archive.

 - You need at least three archives to combine Servlets and EJBs; 1 EAR containing 1 EJB jar and 1 Servlet WAR.

 - Shared libraries must go in the EAR and be included in a specially formatted 'Class-Path' entry in the EAR's MANIFEST file.

 Critically speaking, forcing more than one classloader on an application is where J2EE "jumps the shark" for a large majority of people's needs.