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&#160;<a  href="supported-environments-and-versions.html">Tapestry Users 
mailing list</a> mailing list.</p><h2 
id="SupportedEnvironmentsandVersions-Java&amp;ServletAPIVersions">Java &amp; 
Servlet API Versions</h2><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh">Tapestry Version &#8594;</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&#160;<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 &#8594;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">6+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;9</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;7-9</td><td colspan="1" rowspan="1" class
 ="confluenceTd">&#160;6-9</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">2.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="
 1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">4.2.3</td><td colspan="1" rowspan=
 "1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">4+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="confluenceT
 d">&#160;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td 
colspan="1" rowspan="1" class="confluenceTd">&#160;</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd">Heroku</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160
 ;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td 
colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan
 ="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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 &#8594;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#16
 0;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">JPA</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" row
 span="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Spring</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="confluenceTd
 ">&#160;</td><td colspan="1" rowspan="1" class="confluenceTd">3.1.0</td><td 
colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="
 1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td><td colspan="1" 
 rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="conflu
 enceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.2.1-1.9</td><td co
 lspan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1"
  class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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&#160;<a  href="supported-environments-and-versions.html">Tapestry Users 
mailing list</a> mailing list.</p><h2 
id="SupportedEnvironmentsandVersions-Java&amp;ServletAPIVersions">Java &amp; 
Servlet API Versions</h2><div class="table-wrap"><table 
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" 
class="confluenceTh">Tapestry Version &#8594;</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&#160;<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 &#8594;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">6+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Jetty</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;9</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;7-9</td><td colspan="1" rowspan="1" class
 ="confluenceTd">&#160;6-9</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">2.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="
 1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Apache TomEE</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">JBoss EAP</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">4.2.3</td><td colspan="1" rowspan=
 "1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">4+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Wildfly/JBoss AS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="confluenceT
 d">&#160;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td 
colspan="1" rowspan="1" class="confluenceTd">&#160;</td></tr><tr><td 
colspan="1" rowspan="1" class="confluenceTd">Heroku</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Google App Engine</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160
 ;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td 
colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">+</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Amazon AWS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan
 ="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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 &#8594;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">?-4.3.6</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="confluenceTd"
 >&#160;</td><td colspan="1" rowspan="1" class="confluenceTd">&#160;</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">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">3.3.0+</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
 >class="confluenceTd">JPA</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
 >class="confluenceTd">&#160;</td><td colspan="1
 " rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Spring</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="conflue
 nceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">3.1.0</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">jQuery.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.12.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td cols
 pan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Prototype.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.7.1</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Bootstrap CSS</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td><td colspan
 ="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Moment.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">2.12.0</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" class="c
 onfluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Less4J</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">1.2.1-1.9</td><
 td colspan="1" rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" 
rowspan="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td></tr><tr><td colspan="1" rowspan="1" 
class="confluenceTd">Underscore.js</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspa
 n="1" class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</td><td colspan="1" rowspan="1" 
class="confluenceTd">&#160;</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>&#160;</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&#160;<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;">&lt;t:if test="!symbol:tapestry.production-mode"&gt;
+<pre class="brush: xml; gutter: false; theme: Default" 
style="font-size:12px;">&lt;t:if test="!symbol:tapestry.production-mode"&gt;
   &lt;p&gt;WARNING: We're running in development mode (slower, and less 
secure)&lt;/p&gt;
 &lt;/t:if&gt;</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&lt;String, String&gt; 
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&lt;String, String&gt; 
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&lt;String, String&gt; 
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&lt;String,FileServicer&gt; 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&lt;String,FileServicer&gt; 
configuration,
   
     @InjectService("TextFileServicer") FileServicer textFileServicer,
@@ -177,7 +177,7 @@
 </p><div class="aui-message aui-message-info">
 Added in 5.2 
    &#160;
-</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&lt;String,FileServicer&gt; 
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&lt;Runnable&gt; 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>
 
 
 


Reply via email to