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

    <meta charset="UTF-8">
      <title>Source Code</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>&nbsp;&raquo&nbsp;<a href="./../dev/">Dev</a></small><br>
    <h1>Source Code

        <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><strong><span style="color: rgb(128,0,0);">We have moved to GIT</span>. This means that anything you may find elsewhere on the site about SVN is no longer valid!</strong></p>

<p>The documentation will be updated over the next few days and weeks but if you find anything that is <strong>really</strong> misleading then please send a message to the developer list at: <a href="mailto:dev@tomee.apache.org">dev@tomee.apache.org</a></p>

<p>Probably the best GIT tutorial on the planet can be found here: <a href="https://www.atlassian.com/git/">https://www.atlassian.com/git/</a> - This is a great reference for both existing and new GIT users. Please take a look.</p>

<h3>GIT Information for Everyone</h3>

<p>You can browse the source code via the <a href="http://git-wip-us.apache.org/repos/asf/tomee.git">web interface</a>.</p>

<p>If you intend to hack on TomEE then it is recommended that you create a <a href="https://github.com">GitHub Account</a> and <a href="https://help.github.com/articles/fork-a-repo/">fork</a> the TomEE repository so that you can submit pull requests (See below).</p>

<p>If you just want to build the source version then you can download (aka clone) the sources of Apache TomEE with a GIT client from the following URL <a href="https://git-wip-us.apache.org/repos/asf/tomee.git">https://git-wip-us.apache.org/repos/asf/tomee.git</a> - The 'master' branch is the current development branch.</p>

<p>Performing the checkout from a command line using the GIT client (recommended) is as easy as executing the following command:</p>

<blockquote>
  <p>git clone <a href="https://git-wip-us.apache.org/repos/asf/tomee.git">https://git-wip-us.apache.org/repos/asf/tomee.git</a> tomee</p>
</blockquote>

<p>If you want to checkout a specific branch then you can just change that in the command:</p>

<blockquote>
  <p>git clone -b tomee-1.7.x <a href="https://git-wip-us.apache.org/repos/asf/tomee.git">https://git-wip-us.apache.org/repos/asf/tomee.git</a> tomee-1.7.x</p>
</blockquote>

<p>Or alternatively with Apache Maven 3.0.5 or later:</p>

<blockquote>
  <p>mvn scm:checkout
  -DconnectionUrl=scm:git:<a href="https://git-wip-us.apache.org/repos/asf/tomee.git">https://git-wip-us.apache.org/repos/asf/tomee.git</a>
  -DcheckoutDirectory=tomee</p>
</blockquote>

<p>Note: This method does not require the GIT client.</p>

<p><a name="SourceCode-Contributors"></a></p>

<h3>GIT Information for TomEE Contributors</h3>

<p><strong>Please read our own detailed GitFlow workflow information <a href="git.html">here</a></strong></p>

<p>We will be using the <a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow">Gitflow Workflow</a> from day one. Please read and understand how this works.</p>

<p>See <a href="https://help.github.com/articles/using-pull-requests/">here</a> for information on pull requests. </p>

<p>The official Apache Committer documentation can be found <a href="https://git-wip-us.apache.org/#committers-getting-started">here</a></p>

<p><a name="SourceCode-Continuousintegration"></a></p>

<h3>Continuous integration</h3>

<p>Apache TomEE continuous integration relies on <a href="http://ci.apache.org/">Apache Buildbot</a>.
All builders are available <a href="http://ci.apache.org/builders">from the page</a>.</p>

<ul>
<li><a href="http://ci.apache.org/builders/tomee-1.7.x-ubuntu">Apache TomEE 1.7.x under Ubuntu</a></li>
<li><a href="http://ci.apache.org/builders/tomee-trunk-ubuntu">Apache TomEE 2.x under Ubuntu</a></li>
<li><a href="http://ci.apache.org/builders/tomee-trunk-win-sunjdk">Apache TomEE 2.x under Windows using a Sun/Oracle JDK</a></li>
<li><a href="http://ci.apache.org/builders/tomee-trunk-win-ibmjdk6">Apache TomEE 2.x under Windows using an IBM JDK</a></li>
</ul>

<p><a name="SourceCode-Building"></a></p>

<h3>Maven</h3>

<p>To build the code, you'll need to grab a copy of <a href="http://maven.apache.org">Apache Maven</a>, version 3.0.5 or later.</p>

<h3>Memory Settings</h3>

<p>It is pretty much guaranteed that you will need to give Maven an increase on the available memory. <br />
Depending on the OS you are working on the fix can be as easy as (Note: <em>-XX:MaxPermSize=256M</em> is ignored by Java 8):  </p>

<blockquote>
  <p>export MAVEN_OPTS="-Xmx768m -XX:MaxPermSize=256M -XX:ReservedCodeCacheSize=64m -Xss2048k"</p>
</blockquote>

<p>on MacOS and Unices or </p>

<blockquote>
  <p>set "MAVEN_OPTS=-Xmx768m -XX:MaxPermSize=256M -XX:ReservedCodeCacheSize=64m -Xss2048k"</p>
</blockquote>

<p>on MS Windows.</p>

<h3>Full Build</h3>

<p>A fast build that skips all tests, generates no reports and creates full distribution archives is as follows:</p>

<blockquote>
  <p>mvn -Dsurefire.useFile=false -DdisableXmlReport=true -DuniqueVersion=false -ff -Dassemble -DskipTests -DfailIfNoTests=false clean install</p>
</blockquote>

<p>The full build with tests takes around 2 hours:</p>

<blockquote>
  <p>mvn -Dassemble clean install</p>
</blockquote>

<p>The output of those commands should end with "BUILD SUCCESSFUL"</p>

<p>It is of course possible to just compile and test individual modules. Just change to the module directory and run the same commands as above.</p>

<h3>Quick Build</h3>

<p>If you are in real a hurry (and let's face it most of us are) you can run a quick build without the examples using the <em>quick</em> profile:</p>

<blockquote>
  <p>mvn -Pquick -Dsurefire.useFile=false -DdisableXmlReport=true -DuniqueVersion=false -ff -Dassemble -DskipTests -DfailIfNoTests=false clean install</p>
</blockquote>

<h3>Binary locations</h3>

<p>Once built, the TomEE binaries will be located at:</p>

<pre><code>ls [project]/tomee/apache-tomee/target/*.zip

tomee/apache-tomee/target/apache-tomee-jaxrs-[version]-SNAPSHOT.zip
tomee/apache-tomee/target/apache-tomee-plus-[version]-SNAPSHOT.zip
tomee/apache-tomee/target/apache-tomee-webprofile-[version]-SNAPSHOT.zip
tomee/apache-tomee/target/apache-tomee-plume-[version]-SNAPSHOT.tar.gz
</code></pre>

<p>The OpenEJB standalone binaries will be located at:</p>

<pre><code>ls [project]/assembly/openejb-standalone/target/*.zip

assembly/openejb-standalone/target/apache-openejb-[version]-SNAPSHOT.zip
</code></pre>




        <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>
