<!DOCTYPE html>
<html lang="en">
  <head>

    <meta charset="UTF-8">
      <title>TomEE and Eclipse</title>
    <meta name="description" content="Apache TomEE">
    <meta name="author" content="Apache TomEE">
    <meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <link href="./resources/css/bootstrap.css" rel="stylesheet">
    <link href="./resources/css/prettify.css" rel="stylesheet">
    <!--link href="./resources/css/bootstrap-mods.css" rel="stylesheet"-->
    <link href="./resources/css/main.css" rel="stylesheet">
    <link href="./resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">

    <script type="text/javascript">
        var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
        var u = encodeURIComponent(""+document.URL);
    
      function fbshare () {
          window.open(
                  "http://www.facebook.com/sharer/sharer.php?u="+u,
                  'Share on Facebook',
                  'width=640,height=426');
      };
      function gpshare () {
          window.open(
                  "https://plus.google.com/share?url="+u,
                  'Share on Google+',
                  'width=584,height=385');
      };
      function twshare () {
          window.open(
                  "https://twitter.com/intent/tweet?url="+u+"&text="+t,
                  'Share on Twitter',
                  'width=800,height=526');
      };
      function pinshare () {
          window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
                  'Share on Pinterest',
                  'width=800,height=526');
      };
    </script>

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="./favicon.ico">
    <link rel="apple-touch-icon" href="./resources/images/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="72x72" href="./resources/images/apple-touch-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="114x114" href="./resources/images/apple-touch-icon-114x114.png">

    <script src="./resources/js/prettify.js" type="text/javascript"></script>
    <script src="./resources/js/jquery-latest.js"></script>
    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
    <script src="./resources/js/common.js"></script>
    <script src="./resources/js/prettyprint.js"></script>
    <!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
    
    <script type="text/javascript">

      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-2717626-1']);
      _gaq.push(['_setDomainName', 'apache.org']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();

    </script>
  </head>

  <body>

    <div class="topbar" data-dropdown="dropdown">
      <div class="fill">
        <div class="container">
          <a class="brand" href="./index.html">Apache TomEE</a>
          <ul class="nav">
              <li class="dropdown">
                  <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                  Apache
                      <b class="caret"></b>
                  </a>
                  <ul class="dropdown-menu">
                     <!-- <li><a href="./misc/whoweare.html">Who we are?</a></li> -->
                     <!-- <li><a href="./misc/heritage.html">Heritage</a></li> -->
                     <li><a href="http://www.apache.org">Apache Home</a></li>
                     <!-- <li><a href="./misc/resources.html">Resources</a></li> -->
                     <li><a href="./misc/contact.html">Contact</a></li>
                     <li><a href="./misc/legal.html">Legal</a></li>
                     <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
                     <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
                     <li class="divider"/>
                     <li><a href="http://www.apache.org/security">Security</a></li>
                  </ul>
              </li>
              <li><a href="./index.html">Home</a></li>
              <li><a href="./downloads.html">Downloads</a></li>
              <li><a href="./documentation.html">Documentation</a></li>
              <li><a href="./examples-trunk/index.html">Examples</a></li>
              <li><a href="./support.html">Support</a></li>
              <li><a href="./contribute.html">Contribute</a></li>
              <li><a href="./security/index.html">Security</a></li>
          </ul>

            <!-- Google CSE Search Box Begins  -->
            <FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
                <INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
                <INPUT type="hidden" name="cof" value="FORID:0">
                <INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
            </FORM>
            <!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
            <!-- Google CSE Search Box Ends -->
        </div>
      </div>
    </div>

    <div class="container">
    

<div class="page-header">
    <small><a href="./index.html">Home</a></small><br>
    <h1>TomEE and Eclipse

        <div style="float: right; position: relative; bottom: -10px; ">
            <a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
            <a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
            <a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
            <a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
            <a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
        </div>
    </h1>
</div>

<p>Using TomEE in Eclipse is pretty simple since it uses the existing Tomcat 7 server adaptor that comes
with Eclipse.</p>

<h2>Quick Start</h2>

<p>An excellent instructional video with step-by-step instructions on how to install Eclipse, TomEE
and create/deploy your first project is available on YouTube here: <a href="http://www.youtube.com/watch?v=Lr8pxEACVRI" title="Getting Started with Apache TomEE">Getting Started with Apache TomEE</a> (Remember to select the 'Generate web.xml descriptor' checkbox during project setup. Otherwise the ejb does not get injected and you will get an error.).</p>

<ol>
<li>Download and install both Apache TomEE and Eclipse.</li>
<li>Start Eclipse and from the main menu go to <strong>File</strong> - <strong>New</strong> - <strong>Dynamic Web Project</strong></li>
<li>Enter a new project name</li>
<li>In the <strong>Target Runtime</strong> section click on the <strong>New Runtime</strong> button.</li>
<li>Pick <strong>Apache Tomcat v7.0</strong> and click Next</li>
<li>Change the <strong>Name</strong> field to <em>TomEE</em> to indicate that this is a TomEE server rather than a Tomcat server.</li>
<li>Set the <strong>Tomcat installation directory</strong> by clicking the <strong>Browse</strong> button and selecting the folder
where you extracted TomEE</li>
<li>Click <strong>Finish</strong> to return to the New Project dialog</li>
<li>Click <strong>Finish</strong> to complete creating your new Project</li>
<li>When you're ready to deploy your project, right-click your project and select Run As - Run On Server</li>
<li>Make sure that the <em>TomEE</em> environment is selected in the <strong>Server runtime environment</strong></li>
<li>On the <strong>Run on Server</strong> dialog, click the <strong>Always use this server when running this project</strong> checkbox</li>
<li>Click <strong>Finish</strong> - Eclipse will start TomEE and deploy your project</li>
</ol>

<h2>Advanced installation</h2>

<ol>
<li>In Eclipse, click on the <strong>Servers</strong> tab, right click and select New - Server.</li>
<li>Select <strong>Apache - Tomcat v7.0 Server</strong> and click <strong>Next</strong></li>
<li>Set the <strong>Tomcat installation directory</strong> by clicking the <strong>Browse</strong> button and selecting the folder
where you extracted TomEE</li>
<li>Add your webapp to the server. Click <strong>Finish</strong>.</li>
<li>In the <strong>Servers</strong> tab, double click on your server to open up the <strong>Overview</strong> page.
Click on the <strong>Modules</strong> tab</li>
<li>Click <strong>Add External Web Module</strong>. In the <strong>Add Web Module</strong> dialog, for document base, browse
to <code>&lt;TomEE&gt;/webapps/tomee</code>. Set <strong>Path:</strong> to <code>/tomee</code>. Uncheck <strong>Auto reloading enabled</strong>. Click OK.</li>
<li>Return to the <strong>Overview</strong> tab for the server.</li>
<li>Deselect the <strong>Modules auto reload by default</strong> checkbox.</li>
<li>If you do not want Eclipse to take control of your TomEE installation, select <strong>Use Workspace Metadata</strong>
under <strong>Server Locations</strong>. Please review the <em>Workspace Metadata Installation</em> section below for additional steps
in this scenario. Otherwise, select <strong>Use Tomcat Installation</strong></li>
<li>Click the Save button in Eclipse so the server configuration gets saved.</li>
<li>Click on your webapp project, then select Project - clean. Hit OK. This will cause
Eclipse to clean and rebuild</li>
<li>In the <strong>Servers</strong> tab, right click on the server and select <strong>Publish</strong>.</li>
<li>Start the server.</li>
</ol>

<h3>Workspace Metadata Installation</h3>

<p>If you used <strong>Use Workspace Metadata</strong> in the <strong>Server Locations</strong> definition of the TomEE server,
you will have to add TomEE specific configuration files to your Servers project in your workspace
in case you need to change system properties or add containers / resources and have those reflected in the
server running under Eclipse.</p>

<ol>
<li>Locate your TomEE server configuration in Workspace / Servers</li>
<li>Right-click the server project and select <strong>Import</strong></li>
<li>Select General - File System and click <strong>Next</strong></li>
<li>Browse to your <code>&lt;TomEE&gt;/conf</code> folder</li>
<li>Select the following files for import: <code>logging.properties</code>, <code>system.properties</code> and <code>tomee.xml</code></li>
<li>Click <strong>Finish</strong> to import the files.</li>
<li>In the <strong>Servers</strong> tab, right-click the TomEE server and select <strong>Publish</strong> to publish the files to the
Eclipse metadata folder</li>
</ol>

<p>If you need to modify system properties or change your TomEE resources, containers, etc., you now need to make
those changes in the Workspace / Servers / <code>&lt;</code>Your Server<code>&gt;</code> location and publish them to the server for
the changes to take effect.</p>

<h3>JSP Hot Deployment</h3>

<p>If jsp changes are not being hot deployed then this is because the jsp servlet is set to development=false in the web.xml file. To allow jsp hot deployment alter this value to true and restart Tomee.</p>

<p>This is the relevant snippet of the web.xml file.</p>

<pre><code>&lt;servlet&gt;
    &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;
    ....
    &lt;init-param&gt;
        &lt;param-name&gt;development&lt;/param-name&gt;
        &lt;param-value&gt;true&lt;/param-value&gt;
    &lt;/init-param&gt;
    ....
&lt;/servlet&gt;
</code></pre>

<h2>How to use JULI for TomEE in WTP?</h2>

<p>It seems that WTP doesn't manage correctly Tomcat logging configuration (which needs to be done through
system properties). A quick workaround is to add these properties manually:</p>

<pre><code>-Djava.util.logging.config.file="&lt;tomee&gt;/conf/logging.properties"
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
</code></pre>

<p>More information on: http://wiki.eclipse.org/WTP_Tomcat_FAQ#How_do_I_enable_the_JULI_logging_in_a_Tomcat_5.5_Server_instance.3F</p>




        <div id="edit" class="modal hide fade in" style="display: none; ">
            <div class="modal-header">
                <a class="close" data-dismiss="modal">x</a>

                <h3>Thank you for contributing to the documentation!</h3>
            </div>
            <div class="modal-body">
                <h4>Any help with the documentation is greatly appreciated.</h4>
                <p>All edits are reviewed before going live, so feel free to do much more than fix typos or links.  If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it.  Don't be surprised if we like it so much we ask you for help with other pages :)</p>
                <small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
                <!--[if gt IE 6]>
                <h4>Internet Explorer Users</h4>
                <p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
                <![endif]-->

            </div>
            <div class="modal-footer">
                Do you have an Apache ID?
                <a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
                <a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
            </div>
        </div>
        <script src="./resources/js/bootstrap-modal.js"></script>

        <footer>
            <p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.
                Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation.
                All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
        </footer>

    </div> <!-- /container -->

    <!-- Javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="./resources/js/bootstrap-dropdown.js"></script>

  </body>
</html>
