Modified:
websites/production/tapestry/content/supported-environments-and-versions.html
==============================================================================
---
websites/production/tapestry/content/supported-environments-and-versions.html
(original)
+++
websites/production/tapestry/content/supported-environments-and-versions.html
Sun Feb 18 20:20:09 2018
@@ -67,7 +67,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><p>Tapestry is compatible with a
pretty wide range of app servers, Java versions, and open source libraries. Not
all combinations are known to work, however.</p><p>Note: blanks in the support
matrix tables below do NOT indicate incompatibility. They are just
documentation gaps.</p><p>If you know of any other known compatibilities or
incompatibilities, please add a comment at the bottom of this page, or on
the <a href="supported-environments-and-versions.html">Tapestry Users
mailing list</a> mailing list.</p><h2
id="SupportedEnvironmentsandVersions-Java&ServletAPIVersions">Java &
Servlet API Versions</h2><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh">Tapestry Version →</th><th colspan="1" rowspan="1"
class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan
="1" rowspan="1" class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1"
rowspan="1" class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Java JRE</td><td colspan="1" rowspan="1"
class="confluenceTd">1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.7, 1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6 - 1.8<sup>1,2</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6, 1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1
.6</td><td colspan="1" rowspan="1" class="confluenceTd">1.5, 1.6</td><td
colspan="1" rowspan="1" class="confluenceTd">1.4-1.6</td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Servlet API</td><td colspan="1"
rowspan="1" class="confluenceTd">3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.2-2.3</td></tr></tbody></table></div><p
class="confluence-link"><sup class="confluence-link">1</sup> Tapestry does not
yet work with Java 1.9. See <a clas
s="external-link" href="https://issues.apache.org/jira/browse/TAP5-2588"><span
class="confluence-link">TAP5-2588</span></a>.</p><p><sup>2</sup> For using
Tapestry 5.3.8 with Java 1.8 see <a href="release-notes-538.html">Release
Notes 5.3.8</a></p><p><sup>3</sup> Servlet API 2.5 requires JDK 1.5+</p><h2
id="SupportedEnvironmentsandVersions-AppServers">App Servers</h2><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspa
n="1" rowspan="1" class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache Tomcat</td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1"
class="confluenceTd"> 9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 7-9</td><td colspan="1" rowspan="1" class
="confluenceTd"> 6-9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-7</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Glassfish</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4.2.3</td><td colspan="1" rowspan=
"1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceT
d"> </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Heroku</td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> 
;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan
="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div><h2
id="SupportedEnvironmentsandVersions-Libraries">Libraries</h2><p>These are the
library versions known to work (and, in some cases, bundled with Tapestry).
Unless otherwise noted, adjacent versions will often work fine as well.</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.3-5.3.6</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.2</th><th colspan="1" rows
pan="1" class="confluenceTh">5.3 - 5.3.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.16</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Hibernate</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">
0;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd">3.5.4-3.6.0</td><td colspan="1"
rowspan="1" class="confluenceTd">-3.6.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JPA</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" row
span="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Spring</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceTd
"> </td><td colspan="1" rowspan="1" class="confluenceTd">3.1.0</td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="c
onfluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd">3.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="conflu
enceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.2.1-1.9</td><td co
lspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.3.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div></div>
+ <div id="ConfluenceContent"><p>Tapestry is compatible with a
pretty wide range of app servers, Java versions, and open source libraries. Not
all combinations are known to work, however.</p><p>Note: blanks in the support
matrix tables below do NOT indicate incompatibility. They are just
documentation gaps.</p><p>If you know of any other known compatibilities or
incompatibilities, please add a comment at the bottom of this page, or on
the <a href="supported-environments-and-versions.html">Tapestry Users
mailing list</a> mailing list.</p><h2
id="SupportedEnvironmentsandVersions-Java&ServletAPIVersions">Java &
Servlet API Versions</h2><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh">Tapestry Version →</th><th colspan="1" rowspan="1"
class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan
="1" rowspan="1" class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1"
rowspan="1" class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Java JRE</td><td colspan="1" rowspan="1"
class="confluenceTd">1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.7, 1.8<sup>1</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6 - 1.8<sup>1,2</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">1.6, 1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.5, 1
.6</td><td colspan="1" rowspan="1" class="confluenceTd">1.5, 1.6</td><td
colspan="1" rowspan="1" class="confluenceTd">1.4-1.6</td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Servlet API</td><td colspan="1"
rowspan="1" class="confluenceTd">3.0+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.5+</td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.4+<sup>3</sup></td><td colspan="1" rowspan="1"
class="confluenceTd">2.2-2.3</td></tr></tbody></table></div><p
class="confluence-link"><sup class="confluence-link">1</sup> Tapestry does not
yet work with Java 1.9. See <a clas
s="external-link" href="https://issues.apache.org/jira/browse/TAP5-2588"><span
class="confluence-link">TAP5-2588</span></a>.</p><p><sup>2</sup> For using
Tapestry 5.3.8 with Java 1.8 see <a href="release-notes-538.html">Release
Notes 5.3.8</a></p><p><sup>3</sup> Servlet API 2.5 requires JDK 1.5+</p><h2
id="SupportedEnvironmentsandVersions-AppServers">App Servers</h2><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.0 - 5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspa
n="1" rowspan="1" class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache Tomcat</td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">6+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1"
class="confluenceTd"> 9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 7-9</td><td colspan="1" rowspan="1" class
="confluenceTd"> 6-9</td><td colspan="1" rowspan="1"
class="confluenceTd"> 6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-8</td><td colspan="1" rowspan="1"
class="confluenceTd">6-7</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Glassfish</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="
1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4.2.3</td><td colspan="1" rowspan=
"1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">4+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceT
d"> </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd">Heroku</td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> 
;</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">+</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan
="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div><h2
id="SupportedEnvironmentsandVersions-Libraries">Libraries</h2><p>These are the
library versions known to work (and, in some cases, bundled with Tapestry).
Unless otherwise noted, adjacent versions will often work fine as well.</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh">Tapestry Version →</th><th colspan="1"
rowspan="1" class="confluenceTh">5.5</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.4</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.7</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.3-5.3.6</th><th colspan="1" rowspan="1"
class="confluenceTh">5.3.2</th><th colspan="1" rows
pan="1" class="confluenceTh">5.3 - 5.3.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.2</th><th colspan="1" rowspan="1"
class="confluenceTh">5.1</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.16</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.10</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0.8</th><th colspan="1" rowspan="1"
class="confluenceTh">5.0</th><th colspan="1" rowspan="1"
class="confluenceTh">4.1</th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Hibernate</td><td colspan="1" rowspan="1"
class="confluenceTd">5.1.0.Final</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="confluenceTd"
> </td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
>colspan="1" rowspan="1" class="confluenceTd">3.5.4-3.6.0</td><td colspan="1"
>rowspan="1" class="confluenceTd">-3.6.0</td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
>class="confluenceTd">JPA</td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1" rowspan="1"
>class="confluenceTd"> </td><td colspan="1
" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Spring</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="conflue
nceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.1.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td cols
pan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" cla
ss="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.7</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.1</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd">1.6</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">3.3.6</td><td colspan="1" rowspan="1"
class="confluenceTd">3.0.2</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan
="1" rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1" class="c
onfluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.2.1-1.9</td><
td colspan="1" rowspan="1" class="confluenceTd"> </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspa
n="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">1.3.3</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd">1.17</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr></tbody></table></div></div>
</div>
<div class="clearer"></div>
Modified: websites/production/tapestry/content/symbols.html
==============================================================================
--- websites/production/tapestry/content/symbols.html (original)
+++ websites/production/tapestry/content/symbols.html Sun Feb 18 20:20:09 2018
@@ -31,6 +31,7 @@
<link href='/resources/highlighter/styles/shThemeCXF.css' rel='stylesheet'
type='text/css' />
<script src='/resources/highlighter/scripts/shCore.js'
type='text/javascript'></script>
<script src='/resources/highlighter/scripts/shBrushJava.js'
type='text/javascript'></script>
+ <script src='/resources/highlighter/scripts/shBrushXml.js'
type='text/javascript'></script>
<script>
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
@@ -75,7 +76,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><p><strong>Symbols</strong> are
named configuration settings for Tapestry IOC-based services. Tapestry provides
mechanisms for easy access to symbols from within such services.</p><div
class="aui-label" style="float:right" title="Related Articles">
+ <div
id="ConfluenceContent"><p> </p><p></p><p><strong>Symbols</strong> are
named configuration settings for Tapestry IOC-based services. Tapestry provides
mechanisms for easy access to symbols from within such services.</p><div
class="aui-label" style="float:right" title="Related Articles">
@@ -147,7 +148,7 @@
<h2 id="Symbols-Syntax">Syntax</h2><p>The syntax of symbols is based on Ant
expressions. That is, the name is surrounded by ${ and } characters:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">${some.symbol.name}
</pre>
-</div></div><p>The value on the inside is the <em>symbol name</em>. By
convention, the symbol name is segmented with periods (for example,
"tapestry.production-mode").</p><h2 id="Symbols-Built-inSymbols">Built-in
Symbols</h2><p>The <a href="symbols.html">Symbols</a> page lists the symbol
names used by Tapestry's built-in services.</p><h2
id="Symbols-UsingSymbolsinyourServices">Using Symbols in your
Services</h2><p>Symbols are used inside the @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Value.html">Value</a>
and @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/InjectService.html">InjectService</a>
annotations.</p><p>For example:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>The value on the inside is the <em>symbol name</em>. By
convention, the symbol name is segmented with periods (for example,
"tapestry.production-mode").</p><h2 id="Symbols-Built-inSymbols">Built-in
Symbols</h2><p class="confluence-link">The <a
href="configuration.html">Configuration</a> page lists most of the symbol names
used by Tapestry's built-in services.</p><h2
id="Symbols-UsingSymbolsinyourServices">Using Symbols in your
Services</h2><p>Symbols are used inside the @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/Value.html">Value</a>
and @<a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/annotations/InjectService.html">InjectService</a>
annotations.</p><p>For example:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static MyService build(
@InjectService("${some-service-id}") Collaborator collab)
{
@@ -161,7 +162,7 @@
if (productionMode) {
. . .
</pre>
-</div></div><p>Here Tapestry has <a href="symbols.html">coerced</a> the
"tapestry.production-mode" symbol to a boolean to be injected.</p><p>As an
alternative, the @Symbol annotation, may be used:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Here Tapestry has <a href="type-coercion.html">coerced</a> the
"tapestry.production-mode" symbol to a boolean to be injected.</p><p>As an
alternative, the @Symbol annotation, may be used:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">public class MyService implements MyServiceInterface
{
public MyService(@Symbol(SymbolConstants.PRODUCTION_MODE) boolean
productionMode, ...)
@@ -180,15 +181,15 @@
}
}</pre>
</div></div><p>You can even use them directly in a component template, using
the "symbol" binding prefix:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"><t:if test="!symbol:tapestry.production-mode">
+<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><t:if test="!symbol:tapestry.production-mode">
<p>WARNING: We're running in development mode (slower, and less
secure)</p>
</t:if></pre>
-</div></div><h2 id="Symbols-SymbolResolution">Symbol Resolution</h2><p>Symbols
are resolved by the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/SymbolSource.html">SymbolSource</a>
service. The SymbolSource service checks against an ordered list of <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/SymbolProvider.html">SymbolProvider</a>
objects.</p><p>You may employ additional symbol providers by contributing to
the SymbolSource service configuration, which is an ordered list of
SymbolProviders.</p><p>By default, there are three providers:</p><h3
id="Symbols-SystemPropertiesProvider">SystemProperties Provider</h3><p>The
first provider allows JVM System Properties to provide symbol values. This
allows the use of the <strong>java</strong> command's <strong>-D</strong>
option to provide runtime overrides. This is most often used when testing code,
rather than in pro
duction. SystemProperties is always checked first.</p><h3
id="Symbols-ApplicationDefaultsProvider">ApplicationDefaults
Provider</h3><p>Values not found as System Properties are searched for in the
ApplicationDefaults. This service, ApplicationDefaults, may be configured using
a mapped configuration to provide values.</p><p>From the previous
example:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+</div></div><h2 id="Symbols-SymbolResolution">Symbol Resolution</h2><p>Symbols
are resolved by the <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/SymbolSource.html">SymbolSource</a>
service. The SymbolSource service checks against an ordered list of <a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/SymbolProvider.html">SymbolProvider</a>
objects.</p><p>You may employ additional symbol providers by contributing to
the SymbolSource service configuration, which is an ordered list of
SymbolProviders.</p><p>By default, there are three providers:</p><h3
id="Symbols-SystemPropertiesProvider">SystemProperties Provider</h3><p>The
first provider allows JVM System Properties to provide symbol values. This
allows the use of the <strong>java</strong> command's <strong>-D</strong>
option to provide runtime overrides. This is most often used when testing code,
rather than in pro
duction. SystemProperties is always checked first.</p><h3
id="Symbols-ApplicationDefaultsProvider">ApplicationDefaults
Provider</h3><p>Values not found as System Properties are searched for in the
ApplicationDefaults. This service, ApplicationDefaults, may be configured using
a mapped configuration to provide values.</p><p>From the previous
example:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>AppModule.java (partial)</b></div><div class="codeContent panelContent
pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public void
contributeApplicationDefaults(MappedConfiguration<String, String>
configuration)
{
configuration.add("some-service-id", "WackyCollaborator");
}</pre>
-</div></div><h3 id="Symbols-FactoryDefaultsProvider">FactoryDefaults
Provider</h3><p>This is the same as ApplicationDefaults, but checked only if a
value is not satisfied by SystemProperties or
ApplicationDefaults.</p><p>Libraries will typically set reasonable defaults as
contributions to the FactoryDefaults service configuration. Individual
applications may hard code overrides of those defaults using
ApplicationDefaults. Individual developers may override even those defaults by
setting JVM System Properties.</p><p>FactoryDefaults is always checked last
when resolving symbol names to symbol values.</p><h2
id="Symbols-RecursiveSymbols">Recursive Symbols</h2><p>It is possible and valid
to define one symbol in terms of one or more other symbols.</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><h3 id="Symbols-FactoryDefaultsProvider">FactoryDefaults
Provider</h3><p>This is the same as ApplicationDefaults, but checked only if a
value is not satisfied by SystemProperties or
ApplicationDefaults.</p><p>Libraries will typically set reasonable defaults as
contributions to the FactoryDefaults service configuration. Individual
applications may hard code overrides of those defaults using
ApplicationDefaults. Individual developers may override even those defaults by
setting JVM System Properties.</p><p>FactoryDefaults is always checked last
when resolving symbol names to symbol values.</p><h2
id="Symbols-RecursiveSymbols">Recursive Symbols</h2><p>It is possible and valid
to define one symbol in terms of one or more other symbols.</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>AppModule.java (partial)</b></div><div
class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public void
contributeFactoryDefaults(MappedConfiguration<String, String>
configuration)
{
configuration.add("report.url",
"http://${report.host}:${report.port}/${report.path}");
@@ -196,7 +197,7 @@
configuration.add("report.port", "80");
configuration.add("report.path", "/report.cgi");
}</pre>
-</div></div><p>The ordinary default for <code>report.url</code> will be
<code><a class="external-link"
href="http://www.myreportsite.com:80/report.cgi"
rel="nofollow">http://www.myreportsite.com:80/report.cgi</a></code>.</p><p>However,
this can be changed by making an overriding contribution to the
ApplicationDefaults service configuration.</p><p>Tapestry checks that no symbol
is directly or indirectly dependent on itself. For example, the following
contribution is illegal:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
+</div></div><p>The ordinary default for <code>report.url</code> will be:
<code><span
class="nolink">http://www.myreportsite.com:80/report.cgi</span></code></p><p>However,
this can be changed by making an overriding contribution to the
ApplicationDefaults service configuration.</p><p>Tapestry checks that no symbol
is directly or indirectly dependent on itself. For example, the following
contribution is illegal:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public void
contributeApplicationDefaults(MappedConfiguration<String, String>
configuration)
{
configuration.add("report.path", "${report.url}/report.cgi");
Modified: websites/production/tapestry/content/tapestry-ioc-configuration.html
==============================================================================
--- websites/production/tapestry/content/tapestry-ioc-configuration.html
(original)
+++ websites/production/tapestry/content/tapestry-ioc-configuration.html Sun
Feb 18 20:20:09 2018
@@ -144,7 +144,7 @@
</div>
-<p>One of the key concepts in Tapestry IoC is <em>distributed
configuration</em>. The <em>distributed</em> part refers to the fact that
<em>any module</em> may configure a service. Distributed configuration is the
key feature of Tapestry IoC that supports extensibility and
modularity.</p><p>Modules configure a service by <em>contributing</em> to
service configurations. This may seem esoteric but is really pretty simple.
We'll explain with an example.</p><p>Let's say you've written a bunch of
different services, each of which does something specific for a particular type
of file (identified by the file's extension), and each implements the same
interface, which we'll call FileServicer. And now let's say you need a central
service that selects the one of your FileServicer implementations based on a
given file extension. You start by providing a <a
href="tapestry-ioc-configuration.html">service builder method</a>:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="c
odeContent panelContent pdl">
+<p>One of the key concepts in Tapestry IoC is <em>distributed
configuration</em>. The <em>distributed</em> part refers to the fact that
<em>any module</em> may configure a service. Distributed configuration is the
key feature of Tapestry IoC that supports extensibility and
modularity.</p><p>Modules configure a service by <em>contributing</em> to
service configurations. This may seem esoteric but is really pretty simple.
We'll explain with an example.</p><p>Let's say you've written a bunch of
different services, each of which does something specific for a particular type
of file (identified by the file's extension), and each implements the same
interface, which we'll call FileServicer. And now let's say you need a central
service that selects the one of your FileServicer implementations based on a
given file extension. You start by providing a <a
href="defining-tapestry-ioc-services.html">service builder method</a>:</p><div
class="code panel pdl" style="border-width: 1px;"><div clas
s="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static FileServiceDispatcher
buildFileServicerDispatcher(Map<String,FileServicer> contributions)
{
return new FileServiceDispatcherImpl(contributions);
@@ -155,7 +155,7 @@
configuration.add("txt", new TextFileServicer());
configuration.add("pdf", new PDFFileServicer());
} </pre>
-</div></div><p>Or, instead of instantiating those services ourselves, we could
<a href="tapestry-ioc-configuration.html">inject</a> them:</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Or, instead of instantiating those services ourselves, we could
<a href="injection-in-detail.html">inject</a> them:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static void
contributeFileServicerDispatcher(MappedConfiguration<String,FileServicer>
configuration,
@InjectService("TextFileServicer") FileServicer textFileServicer,
@@ -177,7 +177,7 @@
</p><div class="aui-message aui-message-info">
Added in 5.2
 
-</div>If you prefer annotations over naming conventions you can use the @<a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Contribute.html">Contribute</a>
annotation. As of version 5.2 this annotation that may be placed on a
contributor method of a module instead of starting the methods name with
"contribute". The value of the annotation is the type of the service to
contribute into.<p>The primary reasons to use @Contribute and marker
annotations is twofold:</p><ul><li>There is no longer a linkage between the
contribution method name and the service id, which is much more refactoring
safe: if you change the service interface name, or the ID of the service, your
method will still be invoked when using @Contribute.</li></ul><ul><li>It makes
it much easier for an <a href="tapestry-ioc-configuration.html">override</a>
of the service to get the configuration intended for the original
service.</li></ul><p>The following example is
an annotation-based alternative for the contribution method above.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+</div>If you prefer annotations over naming conventions you can use the @<a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/Contribute.html">Contribute</a>
annotation. As of version 5.2 this annotation that may be placed on a
contributor method of a module instead of starting the methods name with
"contribute". The value of the annotation is the type of the service to
contribute into.<p>The primary reasons to use @Contribute and marker
annotations is twofold:</p><ul><li>There is no longer a linkage between the
contribution method name and the service id, which is much more refactoring
safe: if you change the service interface name, or the ID of the service, your
method will still be invoked when using @Contribute.</li></ul><ul><li>It makes
it much easier for an <span class="confluence-link">override</span> of the
service to get the configuration intended for the original
service.</li></ul><p>The following example is an annotat
ion-based alternative for the contribution method above.</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">@Contribute(FileServiceDispatcher.class)
public static void
arbitraryMethodName(MappedConfiguration<String,FileServicer>
configuration)
{
@@ -221,7 +221,7 @@ public static void arbitraryMethodName(M
configuration.add(new JMSStartup());
configuration.add(new FileSystemStartup());
} </pre>
-</div></div><p>The Configuration interface defines just a single method:
<code>add()</code>. This is very intentional: the only thing you can do is add
new items. If we passed in a Collection, you might be tempted to check it for
values, or remove them ... but that flies in the face of the fact that the
order of execution of these service contribution methods is entirely
unknown.</p><p>For readability, we've parameterized the configuration parameter
of the method, constraining it to instances of java.lang.Runnable, so as to
match the corresponding parameter. This is optional, but often very helpful. In
any case, attempting to contribute an object that doesn't extend or implement
the type (Runnable) will result in a runtime warning (and the value will be
ignored).</p><p>Tapestry supports only this simple form of parameterized types.
Java generics supports a wider form, "wildcards", that Tapestry doesn't
understand.</p><p><span class="confluence-anchor-link"
id="TapestryIoCConfigurati
on-Ordered_List"></span></p><h2
id="TapestryIoCConfiguration-OrderedList">Ordered List</h2><p>Ordered lists are
much more common. With an ordered list, the contributions are sorted into a
proper order before being provided to the service builder method.</p><p>Again,
the order in which service contribution methods are invoked is unknown.
Therefore, the order in which objects are added to the configuration is not
known. Instead, we enforce an order on the items <em>after</em> all the
contributions have been added. As with <a
href="tapestry-ioc-configuration.html">service decorators</a>, we set the order
by giving each contributed object a unique id, and identifying (by id) which
items must preceded it in the list, and which must follow.</p><p>So, if we
changed our Startup service to require a specific order for startup:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
+</div></div><p>The Configuration interface defines just a single method:
<code>add()</code>. This is very intentional: the only thing you can do is add
new items. If we passed in a Collection, you might be tempted to check it for
values, or remove them ... but that flies in the face of the fact that the
order of execution of these service contribution methods is entirely
unknown.</p><p>For readability, we've parameterized the configuration parameter
of the method, constraining it to instances of java.lang.Runnable, so as to
match the corresponding parameter. This is optional, but often very helpful. In
any case, attempting to contribute an object that doesn't extend or implement
the type (Runnable) will result in a runtime warning (and the value will be
ignored).</p><p>Tapestry supports only this simple form of parameterized types.
Java generics supports a wider form, "wildcards", that Tapestry doesn't
understand.</p><p><span class="confluence-anchor-link"
id="TapestryIoCConfigurati
on-Ordered_List"></span></p><h2
id="TapestryIoCConfiguration-OrderedList">Ordered List</h2><p>Ordered lists are
much more common. With an ordered list, the contributions are sorted into a
proper order before being provided to the service builder method.</p><p>Again,
the order in which service contribution methods are invoked is unknown.
Therefore, the order in which objects are added to the configuration is not
known. Instead, we enforce an order on the items <em>after</em> all the
contributions have been added. As with <a
href="tapestry-ioc-decorators.html">service decorators</a>, we set the order by
giving each contributed object a unique id, and identifying (by id) which items
must preceded it in the list, and which must follow.</p><p>So, if we changed
our Startup service to require a specific order for startup:</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;"> public static Runnable buildStartup(final
List<Runnable> configuration)
{
return new Runnable()
@@ -239,15 +239,14 @@ public static void arbitraryMethodName(M
configuration.add("JMS", new JMSStartup());
configuration.add("FileSystem", new FileSystemStartup(),
"after:CacheSetup");
} </pre>
-</div></div><p>Often, you don't care about ordering; the first form of the add
method is used then. The ordering algorithm will find a spot for the object
(here the JMSStartup instance) based on the constraints of other contributed
objects.</p><p>For the "FileSystem" contribution, a constraint has been
specified, indicating that FileSystem should be ordered after some other
contribution named "CacheSetup". Any number of such <a
href="tapestry-ioc-configuration.html">ordering constraints</a> may be
specified (the <code>add()</code> method accepts a variable number of
arguments).</p><p>The object passed in may be null; this is valid, and is
considered a "join point": points of reference in the list that don't actually
have any meaning of their own, but can be used when ordering other elements.
<em>TODO: Show example for chain of command, once that's put
together.</em></p><p>Null values, once ordered, are edited out (the List passed
to the service builder method does not include any n
ulls). Again, they are allowed as placeholders, for the actual contributed
objects to organize themselves around.
+</div></div><p>Often, you don't care about ordering; the first form of the add
method is used then. The ordering algorithm will find a spot for the object
(here the JMSStartup instance) based on the constraints of other contributed
objects.</p><p>For the "FileSystem" contribution, a constraint has been
specified, indicating that FileSystem should be ordered after some other
contribution named "CacheSetup". Any number of such <a
href="ordering-by-constraints.html">ordering constraints</a> may be specified
(the <code>add()</code> method accepts a variable number of
arguments).</p><p>The object passed in may be null; this is valid, and is
considered a "join point": points of reference in the list that don't actually
have any meaning of their own, but can be used when ordering other elements.
<em>TODO: Show example for chain of command, once that's put
together.</em></p><p>Null values, once ordered, are edited out (the List passed
to the service builder method does not include any null
s). Again, they are allowed as placeholders, for the actual contributed
objects to organize themselves around.
</p><div class="aui-message aui-message-info">
Added in 5.3
When using {{add()}} without any specific constraints, a default constraint
is added: after the previously added element. These default constraints are
only within a single contribution method, but makes it much easier to set the
order of several related contributions. Note that the contributions will be
ordered relative to each other and it's possible that contributions by some
other module or method may be interspersed between them.
-
-</div><h2 id="TapestryIoCConfiguration-MappedConfigurations">Mapped
Configurations</h2><p>As discussed in the earlier examples, mapped
configurations are also supported. The keys passed in must be unique. When
conflicts occur, Tapestry will log warnings (identifying the source of the
conflict, in terms of invoked methods), and ignore the conflicting
value.</p><p>Neither the key nor the value may be null.</p><p>For mapped
configurations where the key type is String, a <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/util/CaseInsensitiveMap.html">CaseInsensitiveMap</a>
will be automatically used (and passed to the service builder method), to help
ensure that <a href="tapestry-ioc-configuration.html">case insensitivity</a>
is automatic and pervasive.</p><h1
id="TapestryIoCConfiguration-InjectingClasses">Injecting Classes</h1><p>All
three configuration interfaces have a second method,
<code>addInstance()</code>. This method takes a cla
ss, not an instance. The class is instantiated and contributed. If the
constructor for the class takes dependencies, those are injected as
well.</p><h1 id="TapestryIoCConfiguration-InjectingResources">Injecting
Resources</h1><p>In addition to injecting services into a contributor method
(via the @InjectService and @Inject annotations), Tapestry will key off of the
parameter type to allow other things to be injected.</p><ul><li><a
class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ObjectLocator.html">ObjectLocator</a>:
access to other services visible to the contributing
module</li><li>org.slf4j.Logger: the Logger for the service being contributed
to</li></ul><p>No annotation is needed for these cases.</p><p><span
class="confluence-anchor-link"
id="TapestryIoCConfiguration-overrides"></span></p><h1
id="TapestryIoCConfiguration-ConfigurationOverrides">Configuration
Overrides</h1><p>
+</div><h2 id="TapestryIoCConfiguration-MappedConfigurations">Mapped
Configurations</h2><p>As discussed in the earlier examples, mapped
configurations are also supported. The keys passed in must be unique. When
conflicts occur, Tapestry will log warnings (identifying the source of the
conflict, in terms of invoked methods), and ignore the conflicting
value.</p><p>Neither the key nor the value may be null.</p><p>For mapped
configurations where the key type is String, a <a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/util/CaseInsensitiveMap.html">CaseInsensitiveMap</a>
will be automatically used (and passed to the service builder method), to help
ensure that <a href="case-insensitivity.html">case insensitivity</a> is
automatic and pervasive.</p><h1
id="TapestryIoCConfiguration-InjectingClasses">Injecting Classes</h1><p>All
three configuration interfaces have a second method,
<code>addInstance()</code>. This method takes a class, not
an instance. The class is instantiated and contributed. If the constructor for
the class takes dependencies, those are injected as well.</p><h1
id="TapestryIoCConfiguration-InjectingResources">Injecting Resources</h1><p>In
addition to injecting services into a contributor method (via the
@InjectService and @Inject annotations), Tapestry will key off of the parameter
type to allow other things to be injected.</p><ul><li><a class="external-link"
href="http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/ObjectLocator.html">ObjectLocator</a>:
access to other services visible to the contributing
module</li><li>org.slf4j.Logger: the Logger for the service being contributed
to</li></ul><p>No annotation is needed for these cases.</p><p><span
class="confluence-anchor-link"
id="TapestryIoCConfiguration-overrides"></span></p><h1
id="TapestryIoCConfiguration-ConfigurationOverrides">Configuration
Overrides</h1><p>