blob: 3325dba17e0d68cc7a52b6177408b70d82f288bf [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../favicon.ico">
<link rel="icon" type="image/png" href="../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../css/owl.css">
<link rel="stylesheet" type="text/css" href="../css/animate.css">
<link rel="stylesheet" type="text/css" href="../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../css/idea.css">
<link rel="stylesheet" type="text/css" href="../css/cardio.css">
<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="preloader">
<img src="../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/" title="Apache TomEE">
<span>
<img
src="../img/apache_tomee-logo.svg"
onerror="this.src='../img/apache_tomee-logo.jpg'"
height="50"
>
</span>
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../docs.html">Documentation</a></li>
<li><a href="../community/index.html">Community</a></li>
<li><a href="../security/security.html">Security</a></li>
<li><a class="btn btn-accent accent-orange no-shadow" href="../download.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Releasing TomEE</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre>This document is aimed at guiding a release manager through the general release process. You will need either a Linux, Mac, or failing that a Linux Virtual (with at least a 50GB Drive) on Win.</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_preparation_of_the_branch">Preparation of The Branch</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Run menu:ant -f rat.xml[report.txt] on trunk to ensure all licences are in place.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Review the report.txt and update/add missing headers until clean.</p>
</li>
<li>
<p><em>Tip</em>, search for <strong>Unapproved licenses:</strong> at the beginning of the report for a list.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Branch the version to release and ensure it builds and passes all tests.</p>
</div>
<div class="paragraph">
<p>Add a buildbot CI setup for branch here:</p>
</div>
<div class="paragraph">
<p><a href="https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/projects/tomee.conf" class="bare">https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/projects/tomee.conf</a></p>
</div>
<div class="paragraph">
<p>Basically search for the following line and it should be obvious how to add a new builder:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>c['builders'].append(tomee_hemera_builder("tomee-trunk-ubuntu", "tomee/tomee/trunk"))</pre>
</div>
</div>
<div class="paragraph">
<p>An SVN trigger must be added afterwards.
This can only be done by someone with admin permissions, such as any PMC chair or an Infra team member.
Just drop an email to <em>infrastructure@apache.org</em></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_create_a_tck_branch">Create a TCK Branch</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Branch the TCK using the same version as the release branch from here:</p>
</div>
<div class="paragraph">
<p><a href="https://svn.apache.org/repos/tck/tomee-tck/trunk" class="bare">https://svn.apache.org/repos/tck/tomee-tck/trunk</a></p>
</div>
<div class="paragraph">
<p>Update the TCK branch files to point to the version branch.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties</pre>
</div>
</div>
<div class="paragraph">
<p>Run menu:ant -f rat.xml[report.txt] on the branch.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Review the report.txt and update/add missing headers until clean.</p>
</li>
<li>
<p><em>Tip</em>, search for <strong>Unapproved licenses:</strong>.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_check_svn_authentication">Check SVN Authentication</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Pre-authenticate svn repositories to ensure your credentials are cached before using any tools.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://repository.apache.org/content/repositories/testdir2
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://repository.apache.org/content/repositories/testdir2
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_prepare_maven_authentication">Prepare Maven Authentication</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ensure your maven .m2/settings.xml correct, and be aware that the tools currently require a clear text password:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;server&gt;
&lt;id&gt;apache.snapshots.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.releases.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.dist.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;profiles&gt;
&lt;profile&gt;
...
&lt;repositories&gt;
&lt;repository&gt;
&lt;id&gt;apache.dist.https&lt;/id&gt;
&lt;url&gt;https://dist.apache.org/repos/dist&lt;/url&gt;
&lt;/repository&gt;
&lt;/repositories&gt;</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_code_signing_setup">Code Signing Setup</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If this is your first release then you will have to ensure that you have a code signing key prepared on the machine from which you perform the release.
The process is quite intense.
You can find information here:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="http://www.apache.org/dev/release-signing.html" class="bare">http://www.apache.org/dev/release-signing.html</a></p>
</li>
<li>
<p><a href="http://maven.apache.org/developers/release/pmc-gpg-keys.html" class="bare">http://maven.apache.org/developers/release/pmc-gpg-keys.html</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>However, the basic steps are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Create a key using <strong>gpg --gen-key</strong>, using size 4096 and answering the questions that command issues.</p>
</li>
<li>
<p>During the process you will have to generate random entropy, this is best achieved in another console and issuing the command <strong>find / &gt; /dev/null</strong> and waiting a minute.</p>
</li>
<li>
<p>List the keys using <strong>gpg --list-keys</strong> and take note of the name</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Once you have your key then you will need to append it to the key file here:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="http://www.apache.org/dist/tomee/KEYS" class="bare">http://www.apache.org/dist/tomee/KEYS</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>That is best done as the file itself explains, once you open and view it in a UTF-8 safe text editor you will see the description at the top.
+ Just follow the instructions there on how to append your key.
The basic steps are also here, please read both before you proceed:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Save the KEYS file on your local machine and import it using <strong>gpg --import KEYS</strong></p>
</li>
<li>
<p>Then create the new KEYS file using <strong>(gpg --list-sigs <your name="">&amp;&amp; gpg --armor --export <your name="">) &gt;&gt; KEYS</strong></your></your></p>
</li>
<li>
<p>Check that the new KEYS file contains your key.</p>
</li>
<li>
<p>Log in to people.apache.org and locate /dist/tomee/KEYS</p>
</li>
<li>
<p>Make a backup of the remote KEYS file just in case</p>
</li>
<li>
<p>Overwrite the old /dist/tomee/KEYS file with your new one that now also contains your key.</p>
</li>
<li>
<p>Go to <a href="http://pgp.mit.edu/" class="bare">http://pgp.mit.edu/</a> and add your ascii armoured key</p>
</li>
<li>
<p>Take note of your key fingerprint using <strong>gpg --fingerprint <your name=""></strong></your></p>
</li>
<li>
<p>Go to <a href="https://id.apache.org" class="bare">https://id.apache.org</a>, log in and fill OpenPGP Public Key Primary Fingerprint: with the value of your fingerprint.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_build_the_release_tools">Build the Release Tools</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Checkout the release tools using SVN from here <a href="https://svn.apache.org/repos/asf/tomee/sandbox/release-tools" class="bare">https://svn.apache.org/repos/asf/tomee/sandbox/release-tools</a></p>
</div>
<div class="paragraph">
<p>Really read the README.mdtext and follow the instructions for building the 3rd party libraries.
+ Basically SVN checkout and compile <a href="https://svn.codehaus.org/swizzle/trunk">Swizzle</a> and <a href="https://svn.apache.org/repos/asf/creadur/tentacles/trunk">Tentacles</a></p>
</div>
<div class="paragraph">
<p>Build the release tools, <em>mvn clean install -DskipTests -DfailIfNoTests=false</em></p>
</div>
<div class="paragraph">
<p>Have a look at <strong>run.sh</strong> to see the entry point.</p>
</div>
<div class="paragraph">
<p>Understand that the release tools are not polished, and you currently may have to edit source and re-compile.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_site_staging_for_some_of_the_release_steps_you_will_need_to_provide_documentation_on_the_site">Site Staging <a href="#staging"></a> For some of the release steps you will need to provide documentation on the site.</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Checkout the site here:</p>
</div>
<div class="paragraph">
<p><a href="https://svn.apache.org/repos/asf/tomee/site/trunk" class="bare">https://svn.apache.org/repos/asf/tomee/site/trunk</a></p>
</div>
<div class="paragraph">
<p>Most of the content can be found under 'content' and subdirectories.</p>
</div>
<div class="paragraph">
<p>When you commit changes the site should be built automatically by the buildbot, but you can force a build on IRC using:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>**tomee-bot: force build tomee-site-staging**</pre>
</div>
</div>
<div class="paragraph">
<p>The buildbot staging result can be seen here:</p>
</div>
<div class="paragraph">
<p><a href="http://ci.apache.org/builders/tomee-site-staging" class="bare">http://ci.apache.org/builders/tomee-site-staging</a></p>
</div>
<div class="paragraph">
<p>And the actual staging site, where you can review your changes, is here:</p>
</div>
<div class="paragraph">
<p><a href="http://tomee.staging.apache.org/" class="bare">http://tomee.staging.apache.org/</a></p>
</div>
<div class="paragraph">
<p>Once you are happy with the staging you can publish to the real site using:</p>
</div>
<div class="paragraph">
<p><a href="https://cms.apache.org/tomee/publish" class="bare">https://cms.apache.org/tomee/publish</a></p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_begin_the_release_process">Begin The Release Process</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Ensure TCK is passing all tests, and if so create an SVN tag from the branch.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>Note: It is a future goal to either separate OpenEJB from TomEE or unify the versions so the
[maven-release-plugin](http://maven.apache.org/maven-release/maven-release-plugin/) can be used.
Because we cannot use the Maven release tools we currently have to create a an SVN tag manually. The best way to do this is to:
- Copy the branch to a staging branch using:
&gt; svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version] https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Staging [version]"
- Checkout the staging branch using:
&gt; svn co https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging tomee-[version]-staging
- Update all SNAPSHOT versions to the release versions in the local tomee-[version]-staging and commit.
- Create the tag from the staging:
&gt; svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging https://svn.apache.org/repos/asf/tomee/tomee/tags/tomee-[version] -m "Tag [version]"
- Delete the staging branch using:
&gt; svn rm https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Delete staging"</pre>
</div>
</div>
<div class="paragraph">
<p>Open a console on the release-tools directory.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Before running any <strong>./run.sh</strong> activity always check the release tools code for the command tomee-release-tools/src/main/java/org/apache/openejb/tools/release/cmd.
At the moment some of the commands need manually editing to work.
Eventually the commands should be re-written.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>All JIRA actions should be performed on the ASF JIRA here:</p>
</div>
<div class="paragraph">
<p><a href="https://issues.apache.org/jira/browse/TOMEE" class="bare">https://issues.apache.org/jira/browse/TOMEE</a></p>
</div>
<div class="paragraph">
<p>Ensure JIRAs have been filed for commits using <strong>./run.sh reviewcommits</strong></p>
</div>
<div class="paragraph">
<p>Update fixVersions for JIRAs used in SVN commits using <strong>./run.sh updatejiras</strong> - <em>Untested, requires investigation</em></p>
</div>
<div class="paragraph">
<p>Review and bulk Close all JIRAs for the version to be released.</p>
</div>
<div class="paragraph">
<p>Publish the changed binaries report (if any) using <strong>./run.sh comparelibraries</strong></p>
</div>
<div class="paragraph">
<p>Write and publish the release notes preview on the staging site.</p>
</div>
<div class="paragraph">
<p>Publish a summary of the RAT report preview on the staging site.</p>
</div>
<div class="paragraph">
<p>Using the RAT report as a guide update LICENSE and NOTICE files for any changed binaries, and add new ones if required.</p>
</div>
<div class="paragraph">
<p>Update branch versions.
How you do this is up to you at this point in time.</p>
</div>
<div class="paragraph">
<p>Update trunk versions.
How you do this is up to you at this point in time.</p>
</div>
<div class="paragraph">
<p>Create the next version iterations in JIRA.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_rolling_out_the_preview">Rolling Out The Preview</h2>
<div class="sectionbody">
<div class="literalblock">
<div class="content">
<pre>Note: Before running anything below ensure you either have:
- A valid tomee-release.properties from the last release in your home directory (Speak to the last release manager).
- Or have modified **tomee-release-tools/src/main/java/org/apache/openejb/tools/release/Release.java** with current versions and **mvn clean install**.</pre>
</div>
</div>
<div class="paragraph">
<p>Ensure the TCK passes with preview repositories by editing and ensuring paths are correct in the following files:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties</pre>
</div>
</div>
<div class="paragraph">
<p>Publish the preview using <strong>./run.sh roll binaries legal releasenotes preview</strong> - You can run these tasks like so, or individually in order.
It will be likely that this will have to be repeated several times before a successful vote.</p>
</div>
<div class="paragraph">
<p>The <em>legal</em> step will create the legal report files in the /tmp/download/staging-[revision]/legal directory.
These need to be added to the staging repo.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Delete the [legal]/repo and [legal]/content directories, as these are no longer required rm -R /tmp/download/staging-[revision]/legal/content rm -R /tmp/download/staging-[revision]/legal/repo</p>
</li>
<li>
<p>Perform a non-recursive checkout of the staging repo and add the legal: svn co -N <a href="https://dist.apache.org/repos/dist/dev/tomee/staging-">revision</a> /tmp/download/staging mv /tmp/download/staging-[revision]/legal /tmp/download/staging cd /tmp/download/staging-[revision] svn add legal</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Once the binaries are in place add the staging repository to the corresponding TCK project and fire off a build.
To fire off a build on EC2 from the TCK directory speak to the last release manager for the <strong>curl</strong> command to use</p>
</div>
<div class="paragraph">
<p>If the TCK fails then discuss, fix and re-roll.</p>
</div>
<div class="paragraph">
<p>Publish a <a href="https://www.apache.org/foundation/voting.html">Vote</a> if, and only if, the TCK passes.</p>
</div>
<div class="paragraph">
<p>Votes are generally managed and identified using keywords such as [VOTE], [CANCELLED] and [RESULT]</p>
</div>
<div class="paragraph">
<p>If the vote fails then discuss, fix and re-roll.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_voted_binaries">Voted Binaries</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Once the vote has passed then release the binaries on Nexus: <a href="https://repository.apache.org/index.html#welcome" class="bare">https://repository.apache.org/index.html#welcome</a></p>
</div>
<div class="paragraph">
<p>Update both OpenEJB and TomEE JIRA versions as released (Set the release date).</p>
</div>
<div class="paragraph">
<p>Copy the binaries to the release location (User rights require a PMC to do this)</p>
</div>
<div class="literalblock">
<div class="content">
<pre>From: https://dist.apache.org/repos/dist/dev/tomee/staging-[stagingId]/tomee-[version]
To: https://dist.apache.org/repos/dist/release/tomee/tomee-[version]</pre>
</div>
</div>
<div class="paragraph">
<p>Wait for the binaries to replicate to mirrors.
Here is a neat script from David to check the status:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>#!/bin/bash
RELEASE=${1?Specify a release, such as './mirror_check.sh tomee-1.7.1'}
function list_mirrors {
DYN=http://www.apache.org/dyn/closer.cgi/tomee/$RELEASE/
wget -q -O - $DYN | tr '"&gt;&lt; ' '\n' | grep "^http.*$RELEASE/" | sort | uniq
}
function status_code {
wget -v "$1" 2&gt;&amp;1| grep 'awaiting response' | tr ' ' '\n' | grep "[0-9]"
}
list_mirrors | while read n; do
echo "$(status_code $n) $n"
done | sort | grep 'http'</pre>
</div>
</div>
<div class="paragraph">
<p>Commit and publish changes to the site, see <a href="release-tomee.html#staging">Site Staging</a></p>
</div>
<div class="literalblock">
<div class="content">
<pre>https://cms.apache.org/tomee/publish</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_blog">Blog</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Announce to the world that TomEE has new bells and whistles!</p>
</div>
<div class="paragraph">
<p><a href="https://blogs.apache.org/roller-ui/login.rol" class="bare">https://blogs.apache.org/roller-ui/login.rol</a> + <a href="http://twitter.com/ApacheTomEE" class="bare">http://twitter.com/ApacheTomEE</a> + <a href="http://facebook.com/ApacheTomEE" class="bare">http://facebook.com/ApacheTomEE</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="margin-bottom: 30px;"></div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2021 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>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../latest/docs/developer/index.html">Developers</a>
<li><a hef="../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../js/jquery-1.11.1.min.js"></script>
<script src="../js/owl.carousel.min.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/wow.min.js"></script>
<script src="../js/typewriter.js"></script>
<script src="../js/jquery.onepagenav.js"></script>
<script src="../js/tree.jquery.js"></script>
<script src="../js/highlight.pack.js"></script>
<script src="../js/main.js"></script>
</body>
</html>