blob: e6cb906e1392bb3952fd61923597fc17f9221d1c [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">
<!-- Matomo -->
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = "//matomo.privacy.apache.org/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '5']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
})();
<!-- End Matomo Code -->
</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="paragraph">
<p>This document aims to guide a release manager through the general release process.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_requirements">Requirements</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_operating_system">Operating System</h3>
<div class="paragraph">
<p>You will need either a <strong>Linux</strong> or <strong>Mac</strong>. If you are on a <strong>Windows</strong> machine, you should set up a virtual machine (with at least a 50GB drive).
Keep in mind, that you have to upload &gt; 1GB of data, that means, ensure to have a stable and fast connection to the internet. Upload bandwidth is key.</p>
</div>
</div>
<div class="sect2">
<h3 id="_java_maven">Java &amp; Maven</h3>
<div class="paragraph">
<p>Ensure to build with the correct Java and Maven version.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>TomEE 8.x - Java 8 + Maven 3.3.9</p>
</li>
<li>
<p>TomEE 9.x - Java 11 + Maven 3.8.x</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Note: Currently, newer Maven version will fail to deploy <code>*.tar.gz</code> files correctly. This is tracked in <a href="https://issues.apache.org/jira/browse/TOMEE-3903">TOMEE-3903</a>.</p>
</div>
<div class="paragraph">
<p>Ensure to setup <code>JAVA_HOME</code> and <code>PATH</code> correctly, e.g.:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64/
export PATH=$JAVA_HOME/bin:$PATH</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_code_signing_setup">Code Signing Setup</h3>
<div class="paragraph">
<p>If this is your first release then you will have to ensure that you have a <strong>code signing key</strong> prepared on the machine from which you perform the release.
The process obtain a valid key is quite intense. You can find information here:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://www.apache.org/dev/release-signing.html" class="bare">https://www.apache.org/dev/release-signing.html</a></p>
</li>
<li>
<p><a href="https://maven.apache.org/developers/release/pmc-gpg-keys.html" class="bare">https://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 a keysize of <strong>4096</strong> 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="https://downloads.apache.org/tomee/KEYS" class="bare">https://downloads.apache.org/tomee/KEYS</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Note: Adding new keys via SVN to the <strong>KEYS</strong> files can only be conducted by a PMC member.</p>
</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. 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>Checkout <a href="https://dist.apache.org/repos/dist/release/tomee/" class="bare">https://dist.apache.org/repos/dist/release/tomee/</a> via SVN</p>
</li>
<li>
<p>Make a backup of the remote KEYS file just in case</p>
</li>
<li>
<p>Overwrite the old <strong>KEYS</strong> 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>
<li>
<p>Create a <strong>backup</strong> of your private and public key and store it in a <strong>save</strong> location.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_prepare_maven_authentication">Prepare Maven Authentication</h3>
<div class="paragraph">
<p>Ensure your maven <code>.m2/settings.xml</code> are setup correctly and be aware that the tools currently require a clear text password:</p>
</div>
<div class="literalblock">
<div class="content">
<pre> &lt;servers&gt;
&lt;server&gt;
&lt;id&gt;apache.snapshots.https&lt;/id&gt;
&lt;username&gt;ASF_LDAP&lt;/username&gt;
&lt;password&gt;ASF_PASSWORD_IN_CLEAR&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.releases.https&lt;/id&gt;
&lt;username&gt;ASF_LDAP&lt;/username&gt;
&lt;password&gt;ASF_PASSWORD_IN_CLEAR&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.dist.https&lt;/id&gt;
&lt;username&gt;ASF_LDAP&lt;/username&gt;
&lt;password&gt;ASF_PASSWORD_IN_CLEAR&lt;/password&gt;
&lt;/server&gt;
&lt;/servers&gt;
&lt;profiles&gt;
&lt;profile&gt;
&lt;id&gt;my_profile&lt;/id&gt;
&lt;properties&gt;
&lt;gpg.keyname&gt;INSERT_YOUR_GPG_FINGERPRINT&lt;/gpg.keyname&gt;
&lt;/properties&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;
&lt;/profile&gt;
&lt;/profiles&gt;</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_check_svn_authentication">Check SVN Authentication</h3>
<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 [ASF_LDAP] --password [ASF_PASSWORD] -m "Create test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
svn delete --username [ASF_LDAP] --password [ASF_PASSWORD] -m "Delete test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_preparation_of_the_release">Preparation of the release</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_check_licenses_style">Check Licenses &amp; Style</h3>
<div class="paragraph">
<p>Run</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">mvn help:system -U --show-version --fail-at-end clean install -DfailIfNoTests=false -DskipTests -Pstyle,rat</code></pre>
</div>
</div>
<div class="paragraph">
<p>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>Search for <strong>Unapproved licenses:</strong> at the beginning of the report for a list.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Note: This step is always run by the GitHub Actions workflow <strong>and</strong> by the Jenkins build server, so you can check the CI status:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://ci-builds.apache.org/job/Tomee/job/master-sanity-checks/">TomEE Master Sanity Checks</a></p>
</li>
<li>
<p><a href="https://ci-builds.apache.org/job/Tomee/job/tomee-8.x-sanity-checks/">TomEE 8.x Sanity Checks</a></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_check_the_full_builds">Check the full builds</h3>
<div class="paragraph">
<p>Before you can continue, you should check, that the <strong>full</strong> build on Jenkins CI passes <strong>all</strong> tests.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://ci-builds.apache.org/job/Tomee/job/master-build-full/">TomEE Master</a></p>
</li>
<li>
<p><a href="https://ci-builds.apache.org/job/Tomee/job/tomee-8.x-build-full/">TomEE 8.x</a></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_run_the_tck_optional">Run the TCK (optional)</h3>
<div class="paragraph">
<p>If in doubt, it makes sense to run the TCK on dedicated infrastructure.
Instruction can be found in the <a href="https://github.com/apache/tomee-tck">TCK harness repository</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_build_the_release_tools">Build the Release Tools</h3>
<div class="paragraph">
<p>Checkout the release tools using git from <a href="https://github.com/apache/tomee-release-tools" class="bare">https://github.com/apache/tomee-release-tools</a></p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Read</strong> the <code>README.adoc</code> and follow the instructions for building required 3rd party libraries, i.e., checkout <a href="https://svn.apache.org/repos/asf/creadur/tentacles/trunk">Tentacles</a> and build them.</p>
</li>
<li>
<p>Build the release tools by running <code>mvn clean install</code></p>
</li>
<li>
<p>The build will create an executable, which can be run via <code>./target/release</code>.</p>
</li>
<li>
<p>Understand that the release tools are not polished, and you currently may have to edit source and re-compile.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_begin_the_release_process">Begin the Release process</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_build_the_project">Build the project</h3>
<div class="paragraph">
<p>Double check that the tests and (optionally) the TCK passes. If so, go ahead with</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">mvn clean install release:prepare -DskipTests=true -Pmy_profile</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>release:prepare</code> will ask some interactive questions, which need to be answered. If you are unsure, you can specify <code>-DdryRun=true</code> to test it beforehand.</p>
</div>
<div class="paragraph">
<p>This command will create a tag and update the POM files accordingly to the release and the next development iteration.</p>
</div>
<div class="paragraph">
<p>During this process a <code>release.properties</code> is created in the project root, which you should copy to a save location in case something goes wrong.</p>
</div>
</div>
<div class="sect2">
<h3 id="_deploy_to_nexus_staging_area">Deploy to Nexus Staging Area</h3>
<div class="paragraph">
<p>If everything was successful, you can then run</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">mvn release:perform -DskipTests=true -Pmy_profile</code></pre>
</div>
</div>
<div class="paragraph">
<p>This will take some time and upload a bunch of data to <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a></p>
</div>
<div class="paragraph">
<p>After the build succeeds:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Login into <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a></p>
</li>
<li>
<p>Go to <strong>Staging Repositories</strong></p>
</li>
<li>
<p>Find the auto-generated staging repository named <strong>orgapachetomee-xxxx</strong></p>
</li>
<li>
<p>Double-check the content of the repository. For example:</p>
<div class="ulist">
<ul>
<li>
<p>Check if <code>*.tar.gz</code> distribution artifacts are correctly uploaded.</p>
</li>
<li>
<p>Check that <code>*.asc</code> signatures are present.</p>
</li>
</ul>
</div>
</li>
<li>
<p>If your checks are ok, you can <strong>close</strong> the staging repository and move on.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_deploy_source_and_distributions_to_distdev">Deploy Source and Distributions to dist/dev</h3>
<div class="paragraph">
<p>Next, we need to move the distribution bundles (source + zip + tar.gz) to <a href="https://dist.apache.org/repos/dist/dev/tomee/" class="bare">https://dist.apache.org/repos/dist/dev/tomee/</a></p>
</div>
<div class="paragraph">
<p>To do so, open the <code>tomee-release-tools</code>, which you have build in an earlier step.</p>
</div>
<div class="paragraph">
<p>Run</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">./target/release dist maven-to-dev --dry-run --maven-repo=https://repository.apache.org/content/repositories/orgapachetomee-xxxx/ VERSION</code></pre>
</div>
</div>
<div class="paragraph">
<p>and replace <code>xxxx</code> with the staging repository and <code>VERSION</code> with the actual version to perform the release.</p>
</div>
<div class="paragraph">
<p>This will download the required distribution bundles from the staging repository and generate SHA256 / SHA512 hashes.</p>
</div>
<div class="paragraph">
<p>Check that the files were correctly downloaded and the created folder in <code>/tmp</code> contains everything, which is expected for the release (i.e. hashes, gpg sigs, sources, tar.gz and zip files).</p>
</div>
<div class="paragraph">
<p>If everything is <strong>ok</strong>, remove the <code>--dry-run</code> flag and execute:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">./target/release dist maven-to-dev --maven-repo=https://repository.apache.org/content/repositories/orgapachetomee-xxxx/ VERSION</code></pre>
</div>
</div>
<div class="paragraph">
<p>This will download the required distribution bundles from the staging repository and generate SHA256 / SHA512 hashes and commit everything to <a href="https://dist.apache.org/repos/dist/dev/tomee/" class="bare">https://dist.apache.org/repos/dist/dev/tomee/</a>.</p>
</div>
<div class="paragraph">
<p><strong>Note:</strong> Committing the changes will take some time depending on your upload bandwidth. Ensure you have a stable connection.</p>
</div>
<div class="paragraph">
<p>After the upload was successful, check that everything you would expect is available in <a href="https://dist.apache.org/repos/dist/dev/tomee/" class="bare">https://dist.apache.org/repos/dist/dev/tomee/</a></p>
</div>
</div>
<div class="sect2">
<h3 id="_push_the_commits_and_the_tag">Push the commits and the tag</h3>
<div class="paragraph">
<p>Now it is time to push the generated commits <strong>and</strong> the tag generated during <code>release:prepare</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">git push origin &lt;branch&gt;
git push origin &lt;tagname&gt;</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_generate_release_notes_website">Generate release notes (website)</h3>
<div class="paragraph">
<p>Next, you can use <code>tomee-release-tools</code> to generate the release notes for the website.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-bash" data-lang="bash">./target/release release-notes generate VERSION</code></pre>
</div>
</div>
<div class="paragraph">
<p>Create a new branch on <a href="https://github.com/apache/tomee-site-generator/">tomee-site-generator</a> and add a new directory to <code>src/main/jbake/content/&lt;VERSION&gt;</code>.
Copy the output of the command above to a new file <code>release-notes.adoc</code>.Write some sentences summarizing the release and thank all users / contributors, who submitted bug reports, contributed code or documentation for the given release.
You can also get inspiration from previous release notes.</p>
</div>
<div class="paragraph">
<p>In addition, prepare the download pages and move the old version to the download archive.</p>
</div>
</div>
<div class="sect2">
<h3 id="_generate_release_notes_jira">Generate release notes (Jira)</h3>
<div class="ulist">
<ul>
<li>
<p>Go to <a href="https://issues.apache.org/jira/browse/TOMEE">ASF Jira</a></p>
</li>
<li>
<p>Navigate to <a href="https://issues.apache.org/jira/projects/TOMEE?selectedItem=com.atlassian.jira.jira-projects-plugin%3Arelease-page&amp;status=all">Releases</a></p>
</li>
<li>
<p>Create the next version, if it does not exist</p>
</li>
<li>
<p>Move all unresolved issues from the previous version to the new version (this is a bulk action)</p>
</li>
<li>
<p>Navigate to the version, which should be released, and click on <strong>Release Notes</strong>.</p>
</li>
<li>
<p>Verify, that the <strong>Release Notes</strong> only contain resolved issues.</p>
</li>
<li>
<p>Save the permalink to the release notes in Jira as we need it for the VOTE.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_calling_for_a_vote_pmc_only">Calling for a vote (PMC only)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>Publish a <a href="https://www.apache.org/foundation/voting.html">Vote</a>.</p>
</li>
<li>
<p>Votes are generally managed and identified using keywords such as [VOTE], [CANCELLED] and [RESULT]</p>
</li>
<li>
<p>Include links to the staging repository, to dev/dist and to the tag created.</p>
</li>
<li>
<p>Include the changelog and a link to the Jira release notes</p>
</li>
<li>
<p>If the vote fails then discuss, fix and re-roll.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_voted_binaries_pmc_only">Voted Binaries (PMC only)</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p>Once the vote has passed then release the binaries on Nexus: <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a></p>
</li>
<li>
<p>Update both OpenEJB and TomEE JIRA versions as released (Set the release date).</p>
</li>
<li>
<p>Copy the binaries to the release location</p>
<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>
</li>
<li>
<p>Merge the website branch and trigger a <a href="https://ci-builds.apache.org/job/Tomee/job/site-publish/">site deploy via Jenkins</a>.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_spread_the_word">Spread the word!</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Announce to the world that TomEE has new bells and whistles!</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>
<h5 class="light regular light-white">
<a href="../privacy-policy.html" class="white">Privacy Policy</a>
</h5>
</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="https://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="https://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="https://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-2022 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>