blob: e70e9b4d3d39fa5766f9606df2b719d63402225c [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="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</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 href="../../download-ng.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>Alternate Descriptors</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>As of OpenEJB 3.1.1, you have the
ability to specify an alternate set of deployment descriptors to use for
a given environment. This is focused mostly on testing where it is often
desirable to use a slightly different configuration for a set of tests
or even a specific test.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_when_nothing_else_does_the_trick">When nothing else does the trick</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Note that this approach was added as a catch-all for when one of the
simpler overriding techniques will not work. For the common case of
needing to tweak your persistence.xml, see the
<a href="configuring-persistenceunits-in-tests.html">Configuring
PersistenceUnits in Tests</a> page for a simpler approach.</p>
</div>
<div class="paragraph">
<p>For many reasons it is very inconvenient to have to maintain two sets of
descriptors, one for production and one for testing. We aggressively add
features based on user feedback and questions. If you are looking for a
way to solve a problem without duplicating entire descriptors, please
let us know. You should never have to go the long way to do something
simple.</p>
</div>
</div>
</div>
<h1 id="_openejb_altdd_prefix" class="sect0">openejb.altdd.prefix</h1>
<div class="paragraph">
<p>To use this functionality, just set the new "openejb.altdd.prefix"
system property or <code>InitialContext</code> property to something like "<em>test</em>",
then any descriptors in your META-INF/ directory that start with
"<em>test.</em>" will override the regular descriptor. So for example with an
app like this:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>META-INF/ejb-jar.xml</p>
</li>
<li>
<p>META-INF/<em>test</em>.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/persistence.xml</p>
</li>
<li>
<p>META-INF/<em>test</em>.env-entry.properties</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Just initialize your test case like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory");
properties.setProperty("openejb.altdd.prefix", "test");
InitialContext initialContext = new InitialContext(properties);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The logical result will be the prefixed file replacing the non-prefixed
file as the active descriptor:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>META-INF/ejb-jar.xml &#8594; <em>test</em>.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/persistence.xml</p>
</li>
<li>
<p>META-INF/env-entry.properties &#8594; <em>test</em>.env-entry.properties</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This will work in any environment in which OpenEJB works (embedded,
standalone, tomcat, geronimo, etc.).</p>
</div>
<div class="paragraph">
<p>Note that there does <em>not</em> have to be an equivalent non-prefixed version
of the file. In the example above, only a "test.env-entry.properties"
file exists and there is no equivalent plain "env-entry.properties"
file. This prefixing works for any deployment descriptor in the
META-INF/ directory or WEB-INF/ directory. The prefix does not have to
be "test" and could be anything you choose. You can also have as many
prefixed files as you need and could even go as far as to have one
prefix per individual test.</p>
</div>
<h1 id="_more_than_one_prefix" class="sect0">More than one prefix</h1>
<div class="paragraph">
<p>It is possible to have several prefixes, specified in order of
preference, so that it is possible to avoid duplicating descriptors that
are used in more than one "profile". For example, the "foo" test case
uses the same "env-entries.properties" file as the "bar" test case, but
both have their own ejb-jar.xml files:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>META-INF/ejb-jar.xml</p>
</li>
<li>
<p>META-INF/test.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/footest.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/bartest.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/persistence.xml</p>
</li>
<li>
<p>META-INF/test.env-entry.properties</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The "foo" test case could set the <em>openejb.altdd.prefix</em> as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> //...
properties.setProperty("openejb.altdd.prefix", "footest, test");
InitialContext initialContext = new InitialContext(properties);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Resulting the following logical view of the app:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>META-INF/ejb-jar.xml &#8594; <em>footest</em>.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/persistence.xml</p>
</li>
<li>
<p>META-INF/env-entry.properties &#8594; test.env-entry.properties</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>And the "bar" test case could set the <em>openejb.altdd.prefix</em> as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> //...
properties.setProperty("openejb.altdd.prefix", "footest, test");
InitialContext initialContext = new InitialContext(properties);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Resulting the following logical view of the app:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>META-INF/ejb-jar.xml &#8594; <em>bartest</em>.ejb-jar.xml</p>
</li>
<li>
<p>META-INF/persistence.xml</p>
</li>
<li>
<p>META-INF/env-entry.properties &#8594; test.env-entry.properties</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In both scenarios the same env-entry.properties file
(test.env-entry.properties) is shared.</p>
</div>
<div class="paragraph">
<p>Note that there is a "test.ejb-jar.xml" file that is present, however in
both cases it is not used as the order of preference in the list is
"left to right" meaning most preferred first.</p>
</div>
</div>
</div>
</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>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></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-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>
</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>