blob: 601b07c9a1a588dbecd804fc78156ee1549c630e [file] [log] [blame]
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Overlay WebApp Deployer</title><link rel="stylesheet" type="text/css" href="css/docbook.css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"><meta name="keywords" content="jetty, servlet, servlet-api, cometd, http, websocket, eclipse, maven, java, server, software"><link rel="home" href="index.html" title="Jetty : The Definitive Reference"><link rel="up" href="configuring-deployment.html" title="Chapter&nbsp;4.&nbsp;Deploying to Jetty"><link rel="prev" href="quickstart-webapp.html" title="Quickstart Webapps"><link rel="next" href="configuring-contexts.html" title="Chapter&nbsp;5.&nbsp;Configuring Contexts"><link xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" rel="shortcut icon" href="images/favicon.ico"><script type="text/javascript" src="js/shCore.js"></script><script type="text/javascript" src="js/shBrushJava.js"></script><script type="text/javascript" src="js/shBrushXml.js"></script><script type="text/javascript" src="js/shBrushBash.js"></script><script type="text/javascript" src="js/shBrushJScript.js"></script><script type="text/javascript" src="js/shBrushSql.js"></script><script type="text/javascript" src="js/shBrushProperties.js"></script><script type="text/javascript" src="js/shBrushPlain.js"></script><link type="text/css" rel="stylesheet" href="css/shCore.css"><link type="text/css" rel="stylesheet" href="css/shThemeEclipse.css"><link type="text/css" rel="stylesheet" href="css/font-awesome.min.css"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><tr><td style="width: 25%"><a href="http://www.eclipse.org/jetty"><img src="images/jetty-header-logo.png" alt="Jetty Logo"></a><br><span style="font-size: small">
Version: 9.3.0.v20150612</span></td><td style="width: 50%"><script type="text/javascript"> (function() {
var cx = '016459005284625897022:obd4lsai2ds';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script><gcse:search></gcse:search></td></tr></table><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Overlay WebApp Deployer</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="quickstart-webapp.html"><i class="icon-chevron-left"></i> Previous</a>&nbsp;</td><th width="60%" align="center">Chapter&nbsp;4.&nbsp;Deploying to Jetty<br><a accesskey="p" href="index.html"><i class="icon-home"></i> Home</a></th><td width="20%" align="right">&nbsp;<a accesskey="n" href="configuring-contexts.html">Next <i class="icon-chevron-right"></i></a></td></tr></table><hr></div><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="jetty-callout"><h5 class="callout"><a href="http://www.webtide.com/">Contact the core Jetty developers at
<span class="website">www.webtide.com</span></a></h5><p>
private support for your internal/customer projects ... custom extensions and distributions ... versioned snapshots for indefinite support ...
scalability guidance for your apps and Ajax/Comet projects ... development services from 1 day to full product delivery
</p></div><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="overlay-deployer"></a>Overlay WebApp Deployer</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="overlay-deployer.html#overlay-overview">Overview</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#overlay-overlays">Overlays</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#overlay-jtrac">JTrac Overlay Example</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#overlay-configure">Configuring Jetty for Overlays</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#overlay-install">Installing the WebApp</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#d0e3169">Installing a Template Overlay</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#d0e3243">Installing an Instance Overlay</a></span></dt><dt><span class="section"><a href="overlay-deployer.html#overlay-tips">Things to Know and Notice</a></span></dt></dl></div><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"><i class="icon-asterisk"></i> Note</h3><p>
This feature is reintroduced in Jetty 9.0.4
</p></div><p>
The Jetty Overlay Deployer allows you to overlay multiple WAR files so that you can customise, configure, and deploy a web application without unpacking, modifying and repacking the WAR file. This has the following benefits:
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
You can keep the WAR file immutable, even signed, so that it is clear which version you have deployed.
</p></li><li class="listitem"><p>
All modifications you make to customise/configure the web application are separate WARs, and thus are easily identifiable for review and migration to new versions.
</p></li><li class="listitem"><p>
You can create a parameterised template overlay that contains common customisations and configuration that apply to many instances of the web application (for example, for multi-tenant deployment).
</p></li><li class="listitem"><p>
Because the layered deployment clearly identifies the common and instance specific components, Jetty is able to share classloaders and static resource caches for the template, greatly reducing the memory footprint of multiple instances.
</p></li></ul></div><p>
This tutorial describes how to configure Jetty to use the Overlay deployer, and how to deploy multiple instances of a web application, using the JTrac application in the example.
</p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-overview"></a>Overview</h3></div></div></div><p>
Customising, configuring and deploying a web application bundled as a WAR file frequently includes some or all of these steps:
</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
Editing the <code class="filename">WEB-INF/web.xml</code> file to set init parameters, add filters/servlets or to configure JNDI resources.
</p></li><li class="listitem"><p>
Editing other application specific configuration files under <code class="filename">WEB-INF/</code>.
</p></li><li class="listitem"><p>
Editing container specific configuration files under <code class="filename">WEB-INF/</code> (for example, <code class="filename">jetty-web.xml</code> or <code class="filename">jboss-web.xml</code>).
</p></li><li class="listitem"><p>
Adding/modifying static content such as images and CSS to create a style or themes for the web application.
</p></li><li class="listitem"><p>
Adding Jars to the container classpath for Datasource and other resources.
</p></li><li class="listitem"><p>
Modifying the container configuration to provide JNDI resources.
</p></li></ul></div><p>
The result is that the customisations and configurations blend into both the container and the WAR file. If you upgrade either the container or the base WAR file to a new version, it can be a very difficult and error prone task to identify all the changes that you have made, and to reapply them to a new version.
</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-overlays"></a>Overlays</h3></div></div></div><p>
To solve the problems highlighted above, Jetty 7.4 introduces WAR overlays (a concept borrowed from the Maven WAR plugin). An overlay is basically just another WAR file, whose contents merge on top of the original WAR so that you can add or replace files. Jetty overlays also allow you to mix in fragments of web.xml, which means you can modify the configuration without replacing it.
</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-jtrac"></a>JTrac Overlay Example</h3></div></div></div><p>
The JTrac issue tracking web application is a good example of a typical web application, as it uses the usual suspects of libs: spring, hibernate, dom4j, commons-*, wicket, etc. The files for this demonstration are available in overlays-demo.tar.gz. You can expand it on top of the jetty distribution; this tutorial expands it to /tmp and installs the components step-by-step:
</p><div class="screenexample"><pre class="screen">
$ cd /tmp
$ wget http://webtide.intalio.com/wp-content/uploads/2011/05/overlays-demo.tar.gz
$ tar xfvz overlays-demo.tar.gz
$ export OVERLAYS=/tmp/overlays
</pre></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-configure"></a>Configuring Jetty for Overlays</h3></div></div></div><p>
Overlays support is included in jetty distributions from 7.4.1-SNAPSHOT onwards, so you can download a distribution from oss.sonatype.org or maven central and unpack into a directory. You need to edit the start.ini file so that it includes the overlay option and configuration file. The resulting file should look like:
</p><div class="informalexample"><script type="syntaxhighlighter" class="brush: plain;toolbar: false">
<![CDATA[
OPTIONS=Server,jsp,jmx,resources,websocket,ext,overlay
etc/jetty.xml
etc/jetty-deploy.xml
etc/jetty-overlay.xml
]]>
</script></div><p>
The smarts of this are in etc/jetty-deploy.xml, which installs the OverlayedAppProvider into the DeploymentManager. You can then start Jetty normally:
</p><div class="screenexample"><pre class="screen">
$ java -jar start.jar
</pre></div><p>
Jetty is now listening on port 8080, but with no webapp deployed.
</p><div xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"><i class="icon-plus-sign-alt"></i> Important</h3><p>
You should conduct the rest of the tutorial in another window with the JETTY_HOME environment set to the jetty distribution directory.
</p></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-install"></a>Installing the WebApp</h3></div></div></div><p>
You can download and deploy the WAR file for this demo using the following commands, which essentially downloads and extracts the WAR file to the $JETTY_HOME/overlays/webapps directory.
</p><div class="screenexample"><pre class="screen">
$ cd /tmp
$ wget -O jtrac.zip http://sourceforge.net/projects/j-trac/files/jtrac/2.1.0/jtrac-2.1.0.zip/download
$ jar xfv jtrac.zip jtrac/jtrac.war
$ mv jtrac/jtrac.war $JETTY_HOME/overlays/webapps
</pre></div><p>
When you have run these commands (or equivalent), you see in the Jetty server window a message saying that the OverlayedAppProvider has extracted and loaded the WAR file:
</p><div class="informalexample"><script type="syntaxhighlighter" class="brush: plain;toolbar: false">
<![CDATA[
2011-05-06 10:31:54.678:INFO:OverlayedAppProvider:Extract jar:file:/tmp/jetty-distribution-7.4.1-SNAPSHOT/overlays/webapps/jtrac-2.1.0.war!/ to /tmp/jtrac-2.1.0_236811420856825222.extract
2011-05-06 10:31:55.235:INFO:OverlayedAppProvider:loaded jtrac-2.1.0@1304641914666
]]>
</script></div><p>
Unlike the normal webapps dir, loading a WAR file from the overlays/webapp dir does not deploy the web application. It simply makes it available to use as the basis for templates and overlays.
</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="d0e3169"></a>Installing a Template Overlay</h3></div></div></div><p>
A template overlay is a WAR structured directory/archive that contains just the files that you have added or modified to customize/configure the web application for all instances you plan to deploy.
</p><p>
You can install the demo template from the downloaded files with the command:
</p><div class="screenexample"><pre class="screen">
$ mv $OVERLAYS/jtracTemplate\=jtrac-2.1.0 $JETTY_HOME/overlays/templates/
</pre></div><p>
In the Jetty server window, you should see the template loaded with a message like:
</p><div class="informalexample"><script type="syntaxhighlighter" class="brush: plain;toolbar: false">
<![CDATA[
2011-05-06 11:00:08.716:INFO:OverlayedAppProvider:loaded jtracTemplate=jtrac-2.1.0@1304643608715
]]>
</script></div><p>
The contents of the loaded template are as follows:
</p><div class="informalexample"><script type="syntaxhighlighter" class="brush: plain;toolbar: false">
<![CDATA[
templates/jtracTemplate=jtrac-2.1.0
|__ WEB-INF
|__ classes
| |__ jtrac-init.properties
|__ log4j.properties
|__ overlay.xml
|__ template.xml
|__ web-overlay.xml
]]>
</script></div><div class="variablelist"><dl><dt><span class="term">name of the template directory (or WAR)</span></dt><dd><p>
Uses the &#8216;=&#8217; character in jtracTemplate=jtrac-2.1.0 to separate the name of the template from the name of the WAR file in webapps that it applies to. If = is a problem, then you can instead use --.
</p></dd><dt><span class="term">WEB-INF/classes/jtrac-init.properties</span></dt><dd><p>
Replaces the JTrac properties file with an empty file, as the properties it contains are configured elsewhere.
</p></dd><dt><span class="term">WEB-INF/log4j.properties</span></dt><dd><p>
Configures the logging for all instances of the template.
</p></dd><dt><span class="term">WEB-INF/overlay.xml</span></dt><dd><p>
A Jetty XML formatted IoC file that injects/configures the ContextHandler for each instance. In this case it just sets up the context path:
</p></dd></dl></div><div class="informalexample"><script type="syntaxhighlighter" class="brush: xml;toolbar: false">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
</Configure>
]]>
</script></div><div class="variablelist"><dl><dt><span class="term">WEB-INF/template.xml</span></dt><dd><p>
a Jetty XML formatted IoC file that injects/configures the resource cache and classloader that all instances of the template share. It runs only once per load of the template:
</p></dd></dl></div><div class="informalexample"><script type="syntaxhighlighter" class="brush: xml;toolbar: false">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.overlays.TemplateContext">
<Get name="resourceCache">
<Set name="useFileMappedBuffer">true</Set>
<Set name="maxCachedFileSize">10000000</Set>
<Set name="maxCachedFiles">1000</Set>
<Set name="maxCacheSize">64000000</Set>
</Get>
</Configure>
]]>
</script></div><div class="variablelist"><dl><dt><span class="term">WEB-INF/web-overlay.xml</span></dt><dd><p>
a web.xml fragment that Jetty overlays on top of the web.xml from the base WAR file; it can set init parameters and add/modify filters and servlets. In this example it sets the application home and springs rootKey:
</p></dd></dl></div><div class="informalexample"><script type="syntaxhighlighter" class="brush: xml;toolbar: false">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<context-param>
<param-name>jtrac.home</param-name>
<param-value>/tmp/jtrac-${overlay.instance.classifier}</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>jtrac-${overlay.instance.classifier}</param-value>
</context-param>
<filter>
</web-app>
]]>
</script></div><p>
Notice the parameterisation of values such as <code class="code">${overlays.instance.classifier}</code>, as this allows the configuration to be in the template, and not customised for each instance.
</p><p>
Without the Overlay Deployer, you would still need to have configured all of the above, but rather than being in a single clear structure the configuration elements would have been either in the server's common directory, the server's webdefaults.xml (aka server.xml), or baked into the WAR file of each application instance using copied/modified files from the original. The Overlay Deployer allows you to make all these changes in one structure; moreover it allows you to parameterise some of the configuration, which facilitates easy multi-tenant deployment.
</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="d0e3243"></a>Installing an Instance Overlay</h3></div></div></div><p>
Now that you have installed a template, you can install one or more instance overlays to deploy the actual web applications:
</p><div class="screenexample"><pre class="screen">
$ mv /tmp/overlays/instances/jtracTemplate\=blue $JETTY_HOME/overlays/instances/
$ mv /tmp/overlays/instances/jtracTemplate\=red $JETTY_HOME/overlays/instances/
$ mv /tmp/overlays/instances/jtracTemplate\=blue $JETTY_HOME/overlays/instances/
</pre></div><p>
As each instance moves into place, you see the Jetty server window react and deploy that instance. Within each instance, there is the structure:
</p><div class="informalexample"><script type="syntaxhighlighter" class="brush: plain;toolbar: false">
<![CDATA[
instances/jtracTemplate=red/
|__ WEB-INF
| |__ overlay.xml
|__ favicon.ico
|__ resources
|__ jtrac.css
]]>
</script></div><div class="variablelist"><dl><dt><span class="term">WEB-INF/overlay.xml</span></dt><dd><p>
a Jetty XML format IoC file that injects/configures the context for the instance. In this case it sets up a virtual host for the instance:
</p></dd></dl></div><div class="informalexample"><script type="syntaxhighlighter" class="brush: xml;toolbar: false">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="virtualHosts">
<Array type="String">
<Item>127.0.0.2</Item>
<Item>red.myVirtualDomain.com</Item>
</Array>
</Set>
</Configure>
]]>
</script></div><div class="variablelist"><dl><dt><span class="term">favicon.ico</span></dt><dd><p>
Replaces the icon in the base WAR with one that has a theme for the instance, in this case red, blue, or green.
</p></dd><dt><span class="term">resources/jtrac.css</span></dt><dd><p>
Replaces the style sheet from the base WAR with one that his a theme for the instance.
</p></dd></dl></div><p>
You can now view the deployed instances by pointing your browser at http://127.0.0.1:8080, http://127.0.0.2:8080 and http://127.0.0.3:8080. The default username/password for JTrac is admin/admin.
</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="overlay-tips"></a>Things to Know and Notice</h3></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
Each instance has themes with images and style sheets from the instance overlay.
</p></li><li class="listitem"><p>
Each instance is running with its own application directory (that is, /tmp/jtrac-red), set in templates web-overlay.xml.
</p></li><li class="listitem"><p>
A virtual host set in the instance overlay.xml distinguishes the instances.
</p></li><li class="listitem"><p>
All instances share static content from the base WAR and template. Specifically there is a shared ResourceCache so only a single instance of each static content is loaded into memory.
</p></li><li class="listitem"><p>
All instances share the classloader at the base WAR and template level, so that only a single instance of common classes is loaded into memory. You can configure classes with non shared statics to load in the instances classloader.
</p></li><li class="listitem"><p>
Jetty hot deploys all overlays and tracks dependencies.
</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>
If an XML changes in an instance, Jetty redeploys it.
</p></li><li class="listitem"><p>
If an XML changes in a template, then Jetty redeploys all instances using it.
</p></li><li class="listitem"><p>
If a WAR file changes, then Jetty redeploys all templates and all instances dependant on it.
</p></li></ul></div></li><li class="listitem"><p>
You can esaily deploy new versions. For example, when JTrac-2.2.0.war becomes available, you can just drop it into overlays/webapps and then rename jtracTemplate\=jtrac-2.1.0 to jtracTemplate\=jtrac-2.2.0
</p></li><li class="listitem"><p>
There is a fuller version of this demo in overlays-demo-jndi.tar.gz, that uses JNDI (needs options=jndi, annotations and jetty-plus.xml in start.ini) and shows how you can add extra JARs in the overlays.
</p></li></ul></div></div></div><script type="text/javascript">
SyntaxHighlighter.all()
</script><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="quickstart-webapp.html"><i class="icon-chevron-left"></i> Previous</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="configuring-deployment.html"><i class="icon-chevron-up"></i> Top</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="configuring-contexts.html">Next <i class="icon-chevron-right"></i></a></td></tr><tr><td width="40%" align="left" valign="top">Quickstart Webapps&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html"><i class="icon-home"></i> Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;5.&nbsp;Configuring Contexts</td></tr></table></div><p xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times"><div class="jetty-callout">
See an error or something missing?
<span class="callout"><a href="http://github.com/jetty-project/jetty-documentation">Contribute to this documentation at
<span class="website"><i class="icon-github"></i> Github!</span></a></span><span style="float: right"><i>(Generated: 2015-06-15T13:18:15-05:00)</i></span></div></p><script xmlns:jfetch="java:org.eclipse.jetty.xslt.tools.JavaSourceFetchExtension" xmlns:fetch="java:org.eclipse.jetty.xslt.tools.SourceFetchExtension" xmlns:d="http://docbook.org/ns/docbook" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:xslthl="http://xslthl.sf.net" xmlns:gcse="http://www.google.com" xmlns:date="http://exslt.org/dates-and-times" type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1149868-7']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script></body></html>