blob: 6320acb8aa1840d259909b022e8b18cd8e77d530 [file] [log] [blame]
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Chapter&nbsp;15.&nbsp;Application Layer Protocol Negotiation (ALPN)</title><link rel="stylesheet" type="text/css" href="css/docbook.css"><meta name="generator" content="DocBook XSL Stylesheets V1.79.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"><link rel="up" href="jetty-admin-guide.html" title="Part&nbsp;III.&nbsp;Jetty Administration Guide"><link rel="prev" href="jetty-jconsole.html" title="Managing Jetty with JConsole and JMC"><link rel="next" href="http2.html" title="Chapter&nbsp;16.&nbsp;HTTP/2"><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"><link rel="stylesheet" href="css/highlighter/foundation.css"><script src="js/highlight.pack.js"></script><script>
hljs.initHighlightingOnLoad();
</script><link type="text/css" rel="stylesheet" href="css/font-awesome/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.28.v20191105</span></td><td style="width: 50%"></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">Chapter&nbsp;15.&nbsp;Application Layer Protocol Negotiation (ALPN)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="jetty-jconsole.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a>&nbsp;</td><th width="60%" align="center">Part&nbsp;III.&nbsp;Jetty Administration Guide<br><a accesskey="p" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></th><td width="20%" align="right">&nbsp;<a accesskey="n" href="http2.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></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 for sponsored feature development
</p></div><div class="chapter"><div class="titlepage"><div><div><h2 class="title"><a name="alpn-chapter"></a>Chapter&nbsp;15.&nbsp;Application Layer Protocol Negotiation (ALPN)</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="section"><a href="alpn-chapter.html#alpn">Introducing ALPN</a></span></dt></dl></div><p>The development of new web protocols such as HTTP/2 raised the need of protocol negotiation within a Transport Layer Security (TLS) handshake.
A protocol negotiation called <a class="link" href="https://tools.ietf.org/html/rfc7301" target="_top">ALPN</a> (Application Layer Protocol Negotiation) RFC7301 has been defined to accomplish this.</p><p>ALPN has now replaced the older (and now fully deprecated) NPN in the general Web of 2016.</p><p>For those browsers that support HTTP/2, they all now support the ALPN negotiation layers for TLS.
Starting with Jetty 9.3.0, only ALPN is supported by Jetty.</p><div class="section"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="alpn"></a>Introducing ALPN</h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="section"><a href="alpn-chapter.html#alpn-starting">Starting the JVM</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-understanding">Understanding the ALPN API</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-client-example">Client Example</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-server-example">Server Example</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-implementation">Implementation Details</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-tests">Unit Tests</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-debugging">Debugging</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-license-details">License Details</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-versions">Versions</a></span></dt><dt><span class="section"><a href="alpn-chapter.html#alpn-build">How to build ALPN</a></span></dt></dl></div><p>The Jetty project provides an implementation of the TLS extension for ALPN for OpenJDK 7 and OpenJDK 8.
ALPN allows the application layer to negotiate which protocol to use over the secure connection.</p><p>Any protocol can be negotiated by ALPN within a TLS connection.
The protocols that are most commonly negotiated are HTTP/2 (for browsers that support it) and, historically, SPDY.
The ALPN implementation is therefore not HTTP/2 or SPDY specific in any way.
Jetty&#8217;s ALPN implementation, although hosted under the umbrella of the Jetty project, is independent of Jetty (the Servlet Container); you can use the ALPN implementation in any other Java network server.</p><p>The Jetty distribution will automatically enable ALPN when it is needed to by a HTTP/2 connector, so for the most part ALPN is transparent to the average deployer.
This section provides the detail required for non-standard deployments or developing to the ALPN API.</p><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-starting"></a>Starting the JVM</h3></div></div></div><p>To enable ALPN support, start the JVM as follows:</p><pre 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"><code>java -Xbootclasspath/p:&lt;path_to_alpn_boot_jar&gt; ...</code></pre><p>Where <code class="literal">path_to_alpn_boot_jar</code> is the path on the file system for the ALPN Boot Jar file,such as the one at the Maven coordinates <code class="literal">org.mortbay.jetty.alpn:alpn-boot</code>.</p><p>Be certain <a class="link" href="alpn-chapter.html#alpn-versions" title="Versions">to get the ALPN Boot Jar version which matches the version of your JRE</a>.</p><div class="section"><div class="titlepage"><div><div><h4 class="title"><a name="alpn-osgi"></a>Starting in OSGi</h4></div></div></div><p>To use ALPN in an OSGi environment, in addition to putting the ALPN jar on the boot classpath for the container, you will also need to deploy the <code class="literal">jetty-osgi-alpn</code> jar.
This jar contains a Fragment-Host directive that ensures the ALPN classes will be available from the system bundle.</p><p>You can download the <a class="link" href="http://central.maven.org/maven2/org/eclipse/jetty/osgi/jetty-osgi-alpn/" target="_top">jetty-osgi-alpn jar</a> from Maven Central.</p></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-understanding"></a>Understanding the ALPN API</h3></div></div></div><p>Applications need to interact with ALPN TLS extension protocol negotiations.
For example, server applications need to know whether the client supports ALPN, and client applications needs to know whether the server supports ALPN.</p><p>To implement this interaction, Jetty&#8217;s ALPN implementation provides an API to applications, hosted at Maven coordinates
<code class="literal">org.eclipse.jetty.alpn:alpn-api</code>.
You need to declare this dependency as provided, because the <code class="literal">alpn-boot</code> jar already includes it (see the previous section), and it is therefore available from the boot classpath.</p><p>The API consists of a single class, <code class="literal">org.eclipse.jetty.alpn.ALPN</code>, and applications need to register instances of <code class="literal">SSLSocket</code> or <code class="literal">SSLEngine</code> with a <code class="literal">ClientProvider</code> or <code class="literal">ServerProvider</code> (depending on whether the application is a client application or server application).
Refer to <code class="literal">ALPN</code> Javadocs and to the examples below for further details about client and server provider methods.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-client-example"></a>Client Example</h3></div></div></div><pre 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"><code>SSLContext sslContext = ...;
final SSLSocket sslSocket = (SSLSocket)context.getSocketFactory().createSocket("localhost", server.getLocalPort());
ALPN.put(sslSocket, new ALPN.ClientProvider()
{
@Override
public boolean supports()
{
return true;
}
@Override
public List&lt;String&gt; protocols()
{
return Arrays.asList("h2", "http/1.1");
}
@Override
public void unsupported()
{
ALPN.remove(sslSocket);
}
@Override
public void selected(String protocol)
{
ALPN.remove(sslSocket);
System.out.println("Protocol Selected is: " + protocol);
}
});</code></pre><p>The ALPN implementation calls <code class="literal">ALPN.ClientProvider</code> methods <code class="literal">supports()</code>, <code class="literal">protocols()</code>, <code class="literal">unsupported()</code> and <code class="literal">selected(String)</code>, so that the client application can:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">Decide whether to support ALPN</li><li class="listitem">Provide the protocols supported</li><li class="listitem">Know whether the server supports ALPN</li><li class="listitem">Know the protocol chosen by the server</li></ul></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-server-example"></a>Server Example</h3></div></div></div><p>The example for SSLEngine is identical, and you just need to replace the SSLSocket instance with an SSLEngine instance.</p><pre 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"><code>final SSLSocket sslSocket = ...;
ALPN.put(sslSocket, new ALPN.ServerProvider()
{
@Override
public void unsupported()
{
ALPN.remove(sslSocket);
}
@Override
public String select(List&lt;String&gt; protocols);
{
ALPN.remove(sslSocket);
return protocols.get(0);
}
});</code></pre><p>The ALPN implementation calls <code class="literal">ALPN.ServerProvider</code> methods <code class="literal">unsupported()</code>, and <code class="literal">select(List&lt;String&gt;),</code> so that the server application can:</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">know whether the client supports ALPN.</li><li class="listitem">select one of the protocols the client supports.</li></ul></div></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-implementation"></a>Implementation Details</h3></div></div></div><p>It is important that implementations of <code class="literal">ALPN.ServerProvider</code> and <code class="literal">ALPN.ClientProvider</code> remove the <code class="literal">sslSocket</code> or <code class="literal">sslEngine</code> when the negotiation is complete, like shown in the examples above.</p><p>Failing to do so will cause a memory leak.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-tests"></a>Unit Tests</h3></div></div></div><p>You can write and run unit tests that use the ALPN implementation.
The solution that we use with Maven is to specify an additional command line argument to the Surefire plugin:</p><pre 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"><code>&lt;project&gt;
&lt;properties&gt;
&lt;alpn-boot-version&gt;8.1.4.v20150727&lt;/alpn-boot-version&gt;
&lt;/properties&gt;
&lt;build&gt;
&lt;plugins&gt;
&lt;plugin&gt;
&lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
&lt;configuration&gt;
&lt;argLine&gt;
-Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn-boot-version}/alpn-boot-${alpn-boot-version}.jar
&lt;/argLine&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
...
&lt;/plugins&gt;
&lt;/build&gt;
...
&lt;/project&gt;</code></pre></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-debugging"></a>Debugging</h3></div></div></div><p>You can enable debug logging for the ALPN implementation in this way:</p><pre class="literallayout">ALPN.debug = true;</pre><p>Since the ALPN class is in the boot classpath, we chose not to use logging libraries because we do not want to override application logging library choices; therefore the logging is performed directly on <code class="literal">System.err</code>.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-license-details"></a>License Details</h3></div></div></div><p>The ALPN implementation relies on modification of a few OpenJDK classes and on a few new classes that need to live in the <code class="literal">sun.security.ssl</code> package.
These classes are released under the same GPLv2+exception license of OpenJDK.</p><p>The ALPN class and its nested classes are released under same license as the classes of the Jetty project.</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-versions"></a>Versions</h3></div></div></div><p>The ALPN implementation, relying on modifications of OpenJDK classes, updates every time there are updates to the modified OpenJDK classes.</p><div class="table"><a name="d0e15527"></a><p class="title"><b>Table&nbsp;15.1.&nbsp;ALPN vs. OpenJDK versions</b></p><div class="table-contents"><table class="table" summary="ALPN vs. OpenJDK versions" border="1"><colgroup><col class="col_1"><col class="col_2"></colgroup><thead><tr><th align="left" valign="top">OpenJDK version</th><th align="left" valign="top">ALPN version</th></tr></thead><tbody><tr><td align="left" valign="top"><p>1.7.0u40</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u45</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u51</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u55</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u60</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u65</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u67</p></td><td align="left" valign="top"><p>7.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u71</p></td><td align="left" valign="top"><p>7.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u72</p></td><td align="left" valign="top"><p>7.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u75</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u76</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u79</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.7.0u80</p></td><td align="left" valign="top"><p>7.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u05</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u11</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u20</p></td><td align="left" valign="top"><p>8.1.0.v20141016</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u25</p></td><td align="left" valign="top"><p>8.1.2.v20141202</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u31</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u40</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u45</p></td><td align="left" valign="top"><p>8.1.3.v20150130</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u51</p></td><td align="left" valign="top"><p>8.1.4.v20150727</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u60</p></td><td align="left" valign="top"><p>8.1.5.v20150921</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u65</p></td><td align="left" valign="top"><p>8.1.6.v20151105</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u66</p></td><td align="left" valign="top"><p>8.1.6.v20151105</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u71</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u72</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u73</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u74</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u77</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u91</p></td><td align="left" valign="top"><p>8.1.7.v20160121</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u92</p></td><td align="left" valign="top"><p>8.1.8.v20160420</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u101</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u102</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u111</p></td><td align="left" valign="top"><p>8.1.9.v20160720</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u112</p></td><td align="left" valign="top"><p>8.1.10.v20161026</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u121</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u131</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u141</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u144</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u151</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u152</p></td><td align="left" valign="top"><p>8.1.11.v20170118</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u161</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u162</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u171</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u172</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u181</p></td><td align="left" valign="top"><p>8.1.12.v20180117</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u191</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u192</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u201</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u202</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u211<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u212</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u221<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u222</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u231<sup>[1]</sup></p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr><tr><td align="left" valign="top"><p>1.8.0u232</p></td><td align="left" valign="top"><p>8.1.13.v20181017</p></td></tr></tbody></table></div></div><br class="table-break"><p><sup>[1]</sup> These are Oracle releases for which the source code is not available,
or it is unclear what exactly is because there is no correspondent tag in
the OpenJDK repository.
We assume that the source code for these releases is equivalent (at least
for the files modified to make ALPN work) to the release that follows
(for example, for 1.8.0u211 we assume that the source code is equivalent
to 1.8.0u212, for 1.8.0u221 we assume 1.8.0u222, etc.).</p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a name="alpn-build"></a>How to build ALPN</h3></div></div></div><p>This section is for Jetty developers that need to update the ALPN implementation with the OpenJDK versions.</p><p>Clone the OpenJDK repository with the following command:</p><div class="screenexample"><pre class="screen">$ hg clone http://hg.openjdk.java.net/jdk7u/jdk7u jdk7u # OpenJDK 7
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u # OpenJDK 8
$ cd !$
$ ./get_source.sh</pre></div><p>To update the source to a specific tag, use the following command:</p><div class="screenexample"><pre class="screen">$ ./make/scripts/hgforest.sh update &lt;tag-name&gt;</pre></div><p>The list of OpenJDK tags can be obtained from these pages: <a class="link" href="http://hg.openjdk.java.net/jdk7u/jdk7u/tags" target="_top">OpenJDK 7</a> / <a class="link" href="http://hg.openjdk.java.net/jdk8u/jdk8u/tags" target="_top">OpenJDK 8</a>.</p><p>You will then need to compare and incorporate the OpenJDK source changes into the modified OpenJDK classes at the <a class="link" href="https://github.com/jetty-project/jetty-alpn" target="_top">ALPN GitHub Repository</a>, branch <code class="literal">openjdk7</code> for OpenJDK 7 and branch <code class="literal">master</code> for OpenJDK 8.</p></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="jetty-jconsole.html"><i class="fa fa-chevron-left" aria-hidden="true"></i> Previous</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="jetty-admin-guide.html"><i class="fa fa-chevron-up" aria-hidden="true"></i> Top</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="http2.html">Next <i class="fa fa-chevron-right" aria-hidden="true"></i></a></td></tr><tr><td width="40%" align="left" valign="top">Managing Jetty with JConsole and JMC&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html"><i class="fa fa-home" aria-hidden="true"></i> Home</a></td><td width="40%" align="right" valign="top">&nbsp;Chapter&nbsp;16.&nbsp;HTTP/2</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/eclipse/jetty.project">Contribute to this documentation at
<span class="website"><i class="fa fa-github" aria-hidden="true"></i> Github!</span></a></span><span style="float: right"><i>(Generated: 2019-11-05)</i></span></div></p></body></html>